home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / OSEmu / osemu.asm < prev    next >
Assembly Source File  |  2000-04-12  |  78KB  |  3,625 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    osemu.asm
  3. ;  :Author.    Harry, Wepl
  4. ;  :RCS.    $Id: osemu.asm 1.1 1999/02/03 04:10:48 jotd Exp jotd $
  5. ;  :History.    all work before history starts done by Harry
  6. ;    30.06.98   Wepl     rework started
  7. ;    06.07.98   Wepl     rework finished
  8. ;    07.07.98   Wepl     exec.Supervisor,exec.SuperState,exec.UserState
  9. ;                    exec.FindTask,exec.FindPort,exec.OpenDevice
  10. ;                    graphics.alot,exec.DoIO
  11. ;    15.07.98   Wepl     work for Deuteros finished
  12. ;    31.07.1998 Harry    SSP set on memtop again as it is in kick1.3
  13. ;                possibility of trainer routine added
  14. ;    10.08.98   Wepl     osemu header struct changed (SLAVETRAINER now
  15. ;                in osemu-struct instead overgiven via reg)
  16. ;    10.08.98   Wepl     gfx.BltBitMap fixed
  17. ;    ??.08.98   MrLarmer some additions
  18. ;    05.09.98   Wepl     AddIntServer/RemIntServer finally fixed
  19. ;                ReadPixel,WritePixel added
  20. ;    06.09.98   Wepl     return values after init changed (bootblock)
  21. ;                BltTemplate started (but unfinished)
  22. ;    22.09.98   Wepl     _SendIO is now the same as _DoIO (fix for Deuteros)
  23. ;    27.09.98   Harry    dos.lock (untested), device-names even-
  24. ;                aligned (68000-prob), (usp) initialized 
  25. ;                with stacksize (CC3 expects it in 4(usp) at
  26. ;                start), dummy: dos.input+dos.output+
  27. ;                exec.waitport
  28. ;    29.09.1998 Harry    list management functions implemented: 
  29. ;                exec.insert, exec.(add|rem)(head|tail), exec.remove
  30. ;    07.10.1998 Harry    list handling debugged, libs as list, one process
  31. ;                structure, exec.findtask changed, _initlibary
  32. ;                splittet, exec.getmsg, dos.deviceproc, intuition.
  33. ;                openwindow, intuition.closewindow, icon.library,
  34. ;                intuition.cleardmrequest, dos.unloadseg, 
  35. ;                minor fixes
  36. ;    11.10.1998 Harry    devices as list, dos.loadseg supports hunk_symbol,
  37. ;                audio.device-dummy, gfx.allocraster, gfx.freeraster,
  38. ;                gfx.bltclear, gfx.initbitmap (and #fe), intuition.
  39. ;                lockibase dummy, layers.library, mathffp.library,
  40. ;                trackdisk.device-msgport, execlib-table implemented
  41. ;                directly, exec.copymem, exec.findname, minor fixes
  42. ;    19.10.1998 Harry    dos.examine, dos.unlock, exec.setintvector,
  43. ;                audio-interrupts, gfx.getcolormap
  44. ;    20.10.1998 Harry    gfx.set(a|b)pen, gfx.setdrmd, gfx.initrastport,
  45. ;                topaz.font-replacement, gfx.openfont, gfx.setfont,
  46. ;                some gfx-structures
  47. ;    24.10.1998 Harry    gfx.text, some debugging, exec.allocsignal, 
  48. ;                gfx.move, problem with input.addhandler, 
  49. ;                exec.availmem keeps now a reserve of $1000, 
  50. ;                gfx.freecolormap
  51. ;    31.10.98   Wepl     input.device fixed, color handling changed 
  52. ;                (getcolormap,freecolormap,loadrgb4,initview,
  53. ;                initvport,makevport,loadview,setrgb4,getsprite,
  54. ;                freesprite,movesprite,changesprite,vbi
  55. ;    03.11.98   Wepl     bug in AllocMem fixed (size rounded up now)
  56. ;    25.11.1998 Harry    switched back to old gfx-viewport-stuff,
  57. ;                gfx.loadview(0)
  58. ;       30.11.1998 MrLarmer exec.(create|delete)(iorequest|msgport),
  59. ;                exec.freesignal, exec.allocsignal changed
  60. ;    01.12.1998 Harry    libs in osemu extended to V40 (as i dont have 
  61. ;                3.1-includes working with asm-one do not have 
  62. ;                the idea to replace the values by labels,
  63. ;                ill change them back!), exec.exitintr
  64. ;       05.12.1998 Harry    some debugging, list handling debugged again,
  65. ;                           exec.allocmem:MEMF_LARGEST dummy, MEMF_REVERSE
  66. ;                dummy, exec.setsignal, dos.currentdir, 
  67. ;                dos.waitforchar, execbase.vblankfrequency,
  68. ;                dos.duplock
  69. ;    09.01.1999 JOTD     bugfix in DoIO() return code (D0). "implemented"
  70. ;                           CMD_UPDATE (does nothing) and CMD_CLEAR
  71. ;    09.01.1999 JOTD     improved CloseWorkbench() intuition call
  72. ;                           Now returns 0 only once, and then 1
  73. ;                           Led Storm does not lock anymore now
  74. ;       10.01.1999 JOTD     added AlohaWorkbench() intuition call (dummy)
  75. ;                           added WaitBOFVP() (not accurate)
  76. ;                           added CloseScreen() (dummy)
  77. ;       14.01.1999 JOTD     added dos.library Info() function
  78. ;                           (for Flashback)
  79. ;       15.01.1999 JOTD     added D0=0 return codes in input.device
  80. ;       15.01.1999 JOTD     added lowlevel.library, nonvolatile.library
  81. ;                           added cd.device and freeanim.library (dummies)
  82. ;                           added exec CheckIO
  83. ;                           improved DoIO (dummy support of cd.device,cdtv.device)
  84. ;                           added WaitIO (dummy support of cd.device,cdtv.device)
  85. ;                           added SetFunction (for Banshee, now intro OK)
  86. ;       30.01.1999 JOTD     added keyboard.device (not complete)
  87. ;                           installed a default empty copperlist to avoid problems
  88. ;                           with JST
  89. ;       02.02.1999 JOTD     added complete lowlevel.library ReadJoyPort() function
  90. ;                           using function keys (F1-F5) for joypad extra buttons
  91. ;                           DoIO/SendIO: if device is not found, then return with
  92. ;                           no error (dummy for cd.device)
  93. ;                           Oscar CD32 now works perfectly!
  94. ;       18.03.1999 MrLarmer keyboard.device improved
  95. ;                       FreeSignal improved
  96. ;
  97. ;       30.03.1999 JOTD     Added graphics.library InitTmpRas, InitArea
  98. ;       01.04.1999 JOTD     Added mathffp.library SPFlt,SPDiv (removed
  99. ;                           from intuition.s)
  100. ;       01.04.1999 JOTD     Added mathtrans.library SPATan (untested)
  101. ;       17.04.1999 JOTD     Dummy console.device added
  102. ;       19.05.1999 JOTD     Added CMD_WRITE to trackdisk DoIO (for ArcadePool)
  103. ;                           Added dummy entry for nonvolatile StoreEnv
  104. ;                           Added items in the OSEmu structure for use with JST
  105. ;                           Added OSEmu ID, version/release and version string
  106. ;                           Added whdmacros.i include for v10 WHDLoad .i files
  107. ;       26.05.1999 JOTD     Added EntryType to FileInfoBlock structure
  108. ;                           (Sensible Soccer CD32 v1.2 needed 2 $FFFF in struct
  109. ;                           to get hold of the filesize, the bastards!)
  110. ;       08.06.1999 JOTD     Added fastmemory support, debug entry (HRTMon)
  111. ;                           Added flush cache after LoadSeg() succeeded (v1.4)
  112. ;       11.06.1999 JOTD     Corrected LoadSeg() to allocate hunks in chip/fast (v1.5)
  113. ;    26.06.1999 JOTD     Added dummy AssignPath()
  114. ;                           Added disk.resource OpenResource() (no functions yet)
  115. ;                           Fixed a bug in Examine if not found (FreeMem problem)
  116. ;                           Added ExamineFH (SlamTilt)
  117. ;                           Added AllocRemember/FreeRemember (SlamTilt)
  118. ;       10.08.1999 JOTD     Added dummy disk.resource GetUnit()
  119. ;                           Added AllocEntry/FreeEntry (on Bored Seal request) (v1.7)
  120. ;       24.09.1999 JOTD     Bugfixed DupLock() (v1.8)
  121. ;    12.02.2000 JOTD        Added dummy RemakeDisplay for Darkmere (v1.9)
  122. ;                           LoadSeg() bugfix: zero-length hunks are allowed
  123. ;       21.02.2000 Harry    Copperinterrupt implemented, Audioint and 
  124. ;                           Add/RemIcrVector fixed, minor changes (v1.10)
  125. ;                        Added HUNK_DEBUG support to LoadSeg()
  126. ;       02.03.2000 JOTD     Added dummy IoErr() (v1.11)
  127. ;       12.04.2000 JOTD     Improved IoErr() (v1.12)
  128. ;                           Added dos.library ExNext() (don't know if it works well)
  129. ;                           Changed dos.library Examine() for Volumes. Maybe I shouldn't have.
  130. ;                           Added exec.library TypeOfMem() for Subwars 2050
  131. ;                           Added dummy keymap.library, diskfont.library, utility.library
  132. ;
  133. ;    Note:    - does not run with JumpingJackSon because 
  134. ;          it expects an old bug in dos.LoadSeg (APTR instead BPTR)
  135. ;        - with Deuteros and Millenium2·2 the mouse poiner is invisible
  136. ;          now (broken graphics clist stuff)
  137. ;
  138. ;  :Copyright.    GPL
  139. ;  :Language.    68000 Assembler
  140. ;  :Translator.    Asm-One V1.30 R399, Barfly V2.9, Asm-Pro V1.12, Devpac V3.14
  141. ;---------------------------------------------------------------------------*
  142. ; Currently emulated functions:
  143. ;    exec.library
  144. ;        _LVOAddHead
  145. ;        _LVOAddIntServer    ;partial
  146. ;        _LVOAddPort        ;dummy !
  147. ;        _LVOAddTail
  148. ;        _LVOAllocAbs
  149. ;        _LVOAllocMem
  150. ;        _LVOAllocSignal
  151. ;        _LVOAvailMem
  152. ;        _LVOCloseDevice        ;dummy
  153. ;        _LVOCloseLibrary    ;dummy
  154. ;        _LVOCopyMem        ;not optimized
  155. ;        _LVODisable
  156. ;        _LVODoIO        ;some of trackdisk/input
  157. ;        _LVOEnable
  158. ;        _LVOExitIntr        ;experimentally
  159. ;        _LVOFindName
  160. ;        _LVOFindTask        ;partially
  161. ;        _LVOForbid        ;dummy
  162. ;        _LVOFreeMem
  163. ;        _LVOGetMsg        ;dummy
  164. ;        _LVOInsert
  165. ;        _LVOOldOpenLibrary
  166. ;        _LVOOpenDevice        ;only trackdisk/input !
  167. ;        _LVOOpenLibrary
  168. ;        _LVOOpenResource
  169. ;        _LVOPermit        ;dummy
  170. ;        _LVORemove
  171. ;        _LVORemHead
  172. ;        _LVORemIntServer
  173. ;        _LVORemPort        ;dummy
  174. ;        _LVORemTail
  175. ;        _LVOSendIO        ;only input !
  176. ;        _LVOSetIntVector    ;only audiointerrupts
  177. ;        _LVOSetSignal
  178. ;        _LVOSuperState        ;exact v39
  179. ;        _LVOSupervisor
  180. ;        _LVOUserState        ;exact v39
  181. ;    dos.library
  182. ;        _LVOClose
  183. ;        _LVOCurrentDir        ;returns always 0 for rootdir
  184. ;        _LVODeviceProc        ;dummy
  185. ;        _LVODupLock        ;limited to files and null for rootdir
  186. ;        _LVOExamine        ;doesnt work for dirs atm, only files and volumes
  187. ;        _LVOInput        ;dummy
  188. ;        _LVOLoadSeg
  189. ;        _LVOLock        ;atm no dirs, only files and volumes
  190. ;        _LVOOpen
  191. ;        _LVOOutput        ;dummy
  192. ;        _LVORead
  193. ;        _LVOSeek
  194. ;        _LVOUnLoadSeg
  195. ;        _LVOUnLock        ;internal the same as dos.close
  196. ;        _LVOWaitForChar        ;atm dummy, implementation freezed
  197. ;        _LVOWrite
  198. ;    graphics.library
  199. ;        _LVOAllocRaster
  200. ;        _LVOBltBitMap        ;has still some limitations !
  201. ;        _LVOBltClear        ;with CPU
  202. ;        _LVOBltTemplate        ;broken
  203. ;        _LVODisownBlitter    ;dummy
  204. ;        _LVOChangeSprite
  205. ;        _LVODraw        ;dummy !
  206. ;        _LVOFreeColorMap
  207. ;        _LVOFreeRaster
  208. ;        _LVOFreeSprite
  209. ;        _LVOGetColorMap
  210. ;        _LVOGetSprite
  211. ;        _LVOInitBitMap
  212. ;        _LVOInitRastPort
  213. ;        _LVOInitView        ;dummy !
  214. ;        _LVOInitVPort        ;dummy !
  215. ;        _LVOLoadView        ;sets copperlist
  216. ;        _LVOLoadRGB4        ;sets colors immediate
  217. ;        _LVOMakeVPort        ;builds copperlist
  218. ;        _LVOMove
  219. ;        _LVOMoveSprite
  220. ;        _LVOMrgCop
  221. ;        _LVOOwnBlitter        ;dummy
  222. ;        _LVOReadPixel
  223. ;        _LVOSetAPen
  224. ;        _LVOSetBPen
  225. ;        _LVOSetDrMd
  226. ;        _LVOSetRGB4        ;sets color immediate
  227. ;        _LVOText
  228. ;        _LVOVBeamPos
  229. ;        _LVOWaitBlit
  230. ;        _LVOWaitTOF
  231. ;        _LVOWritePixel
  232. ;    intuition.library
  233. ;        _LVOClearDMRequest    ;dummy
  234. ;        _LVOCloseWindow        ;rudimentary
  235. ;        _LVOCloseWorkbench
  236. ;        _LVOOpenWindow        ;rudimentary
  237. ;    ciaa.resource,ciab.resource
  238. ;        _LVOAddICRVector
  239. ;        _LVORemICRVector
  240. ;    icon.library
  241. ;    layers.library
  242. ;    mathffp.library
  243. ;    mathtrans.library
  244. ;---------------------------------------------------------------------------*
  245. ; programs using this stuff (non exhaustive list):
  246. ;    AnotherWorld (WHDLoad), Arcade Pool (JST), Blue Angel 69 (WHDLoad), 
  247. ;       Bombuzal (WHDLoad), Bubble Bobble (JST), Castle Master (WHDLoad), 
  248. ;       Colorado, Crazy Cars 3 (WHDLoad), Deuteros (WHDLoad), Flashback (JST), 
  249. ;       Flink CD32 (WHDLoad), JumpingJackSon (WHDLoad), Lionheart (WHDLoad),
  250. ;       Metal Mutant, North&South (WHDLoad), Oscar CD32 (JST), 
  251. ;       PushOver (WHDLoad), Sensible Soccer CD32 (JST), 
  252. ;       Shadow Fighter CD32 (JST), Son Of Stag series (JST), 
  253. ;       Street Fighter 1 (JST), Bubba and Stix (JST), Sierra Soccer (JST),
  254. ;       Clockwiser (JST), Morph CD32 (JST), Impossible Mission 2025 (JST),
  255. ;       Heimdall 2 AGA (JST), Soldier Of Light (WHDLoad), Tower Of Souls ...
  256. ;
  257. ; unfinished:
  258. ;    Millenium 2·2, Lords of War (works until title), 
  259. ;    Prehistorik (gfx.MrgCop must be improved),
  260. ;       Black Tiger (JST) (works until title), Led Storm (JST) (no gfx in game),
  261. ;    Imperium (JST)
  262. ;---------------------------------------------------------------------------*
  263. ; ToDo:
  264. ;    rewriting memory management for less memory waste
  265. ;    implement dos.waitforchar fully: allow open to raw:, read characters,
  266. ;      close
  267. ;    support nonexisting files in dos.lib
  268. ;
  269. ;---------------------------------------------------------------------------*
  270. ; How to use in WHDLoad:
  271. ;
  272. ;    ;load the osemu module
  273. ;        lea    (_osemu,pc),a0        ;filename of the osemu module
  274. ;        lea    ($400.w),a1        ;the address on which you have
  275. ;                        ;assembled the osemu module
  276. ;        move.l    (_resload,pc),a2    ;the resload base
  277. ;        jsr    (resload_LoadFileDecrunch,a2)    ;this allows to
  278. ;                        ;compress the osemu
  279. ;    ;init the osemu module
  280. ;                        ;system stack has to be on 
  281. ;                        ;top of memory (automatically
  282. ;                        ;done by whdload)
  283. ;        move.l    (_resload,pc),a0    ;the resload base
  284. ;        lea    (_base,pc),a1        ;the slave structure
  285. ;        jsr    $400
  286. ;
  287. ;    ;start the program
  288. ;        move    #0,sr            ;if the program uses the os it
  289. ;                        ;should executed in user mode
  290. ;
  291. ;    ;if you want to add a trainer use this, to setup a routine which will
  292. ;    ;be called each time a key is pressed (d0.b contains rawkeycode)
  293. ;        lea    (_trainer,pc),a0
  294. ;        move.l    a0,($404.w)
  295. ;    ;if you want to use fast memory:
  296. ;        lea    (_base,pc),a1        ;the slave structure
  297. ;        move.l    (ws_ExpMem,A1),($424.w)
  298. ;        move.l    #<expmem size>,($428.w)
  299. ;
  300. ;---------------------------------------------------------------------------*
  301.  
  302. ;---------------------------------------------------------------------------*
  303. ; How to use in JST:
  304. ;
  305. ;    ;allocate expansion memory if needed
  306. ;
  307. ;    move.l    #$100000,D0    ; 1meg
  308. ;    JSRABS    AllocExtMem
  309. ;
  310. ;    ;load the osemu module (when the OS is active)
  311. ;
  312. ;    JSRABS    UseHarryOSEmu
  313. ;
  314. ;    ;start the program
  315. ;
  316. ;    GO_SUPERVISOR
  317. ;    SAVE_OSDATA    xxxx            ; classical OS-kill call
  318. ;
  319. ;    move    #0,sr            ;if the program uses the os it
  320. ;                    ;should executed in user mode
  321. ;                    ;but it's seldom necessary
  322. ;
  323. ;    ;if you want to add a trainer use this, to setup a routine which will
  324. ;    ;be called each time a key is pressed (d0.b contains rawkeycode)
  325. ;        lea    (_trainer,pc),a0
  326. ;        move.l    a0,$400+OSM_SLVTRAINER
  327. ;
  328. ;---------------------------------------------------------------------------*
  329.  
  330.     INCLUDE    whoami.i            ;this contains only a symbol
  331.  
  332.     IFD HARRY                ;(asm-one)
  333.         INCDIR    ASM-ONE:INCLUDE2.0/
  334.         INCLUDE LIBRARIES/DOS_LIB.I
  335.         INCLUDE    LIBRARIES/DOS.I
  336.         INCLUDE    DEVICES/INPUT.I
  337.         INCLUDE    DEVICES/KEYBOARD.I
  338.         INCLUDE    DEVICES/TRACKDISK.I
  339.         INCLUDE    DOS/DOSEXTENS.I
  340.         INCLUDE    DOS/DOSHUNKS.i
  341.         INCLUDE RESOURCES/CIA_LIB.I
  342.         INCLUDE EXEC/EXEC_LIB.I
  343.         INCLUDE    EXEC/MEMORY.I
  344.         INCLUDE    EXEC/TASKS.I
  345.         INCLUDE    GRAPHICS/GRAPHICS_LIB.I
  346.         INCLUDE    GRAPHICS/LAYERS_LIB.I
  347.         INCLUDE    GRAPHICS/GFXBASE.I
  348.         INCLUDE    GRAPHICS/DISPLAYINFO.I
  349.         INCLUDE    GRAPHICS/SPRITE.I
  350.         INCLUDE    HARDWARE/CUSTOM.I
  351.         INCLUDE INTUITION/INTUITION_LIB.I
  352.         INCLUDE INTUITION/INTUITION.I
  353.         INCLUDE    MATH/MATHFFP_LIB.I
  354.         INCLUDE    MATH/MATHTRANS_LIB.I
  355.         INCLUDE    OWN/CCRMAKRO
  356.         INCLUDE    OWN/WHDLOAD.I
  357.         INCLUDE    WORKBENCH/ICON_LIB.I
  358.         INCLUDE    OWN/WHDMACROS.I
  359.         INCLUDE    OWN/LOWLEVEL_LIB.I
  360.         INCLUDE    OWN/LOWLEVEL.I
  361.         INCLUDE    OWN/NONVOLATILE_LIB.I
  362.         INCLUDE RESOURCES/DISK_LIB.I
  363. HUNKB_CHIP    =    30
  364. HUNKB_FAST    =    31
  365.     org    $400
  366.     load    $100000
  367.     ENDC
  368.     IFD WEPL                ;(barfly)
  369.         INCDIR    Includes:
  370.         INCLUDE    devices/input.i
  371.         INCLUDE    devices/inputevent.i
  372.         INCLUDE    devices/trackdisk.i
  373.         INCLUDE    devices/keyboard.I
  374.         INCLUDE    dos/dos.i
  375.         INCLUDE    dos/doshunks.i
  376.         INCLUDE    dos/dosextens.i
  377.         INCLUDE    exec/memory.i
  378.         INCLUDE    exec/tasks.i
  379.         INCLUDE    graphics/gfx.i
  380.         INCLUDE    graphics/gfxbase.i
  381.         INCLUDE    graphics/rastport.i
  382.         INCLUDE    graphics/sprite.i
  383.         INCLUDE    graphics/view.i
  384.         INCLUDE    intuition/intuition.i
  385.         INCLUDE    lvo/cia.i
  386.         INCLUDE    lvo/dos.i
  387.         INCLUDE    lvo/exec.i
  388.         INCLUDE    lvo/graphics.i
  389.         INCLUDE    lvo/icon.i
  390.         INCLUDE    lvo/intuition.i
  391.         INCLUDE    lvo/layers.i
  392.         INCLUDE    lvo/mathffp.i
  393.         INCLUDE    lvo/mathtrans.i
  394.         INCLUDE    whdload.i
  395.         INCLUDE    whdmacros.i    ; added for WHDLoad v10 includes
  396.  
  397.         IFD BARFLY
  398.         BOPT    O+ OG+            ;enable optimizing
  399.         BOPT    ODd- ODe-        ;disable mul optimizing
  400.         BOPT    w4-            ;disable 64k warnings
  401.         SUPER                ;disable supervisor warnings
  402.         ENDC
  403.  
  404.         ORG    $400
  405.         OUTPUT    OSEmu.400
  406.         ;OUTPUT    wart:a/anotherworld/osemumodule400.bin
  407.         ;OUTPUT    wart:b/bombuzal/osemumodule400.bin
  408.         ;OUTPUT    wart:d-f/deuteros/OSEmu.400
  409.         ;OUTPUT    wart:h-j/jumpingjackson/osemumodule400.bin
  410.         ;OUTPUT    wart:m/millennium2·2/OSEmu.400
  411.         ;OUTPUT    wart:n-p/north&south/OSEmu.400
  412.     ENDC
  413.  
  414.     IFD JOTD                ;(phxass/barfly)
  415.         INCDIR    include:
  416.         INCLUDE    "LVOs.i"
  417.         INCLUDE    "jst_libs.i"
  418.         INCLUDE    "dos/doshunks.i"
  419.         INCLUDE "devices/trackdisk.i"
  420.         INCLUDE "devices/input.i"
  421.         INCLUDE    "devices/keyboard.I"
  422.         INCLUDE "devices/inputevent.i"
  423.         INCLUDE "exec/interrupts.i"
  424.         INCLUDE    "graphics/gfx.i"
  425.         INCLUDE    "graphics/gfxbase.i"
  426.         INCLUDE    "graphics/rastport.i"
  427.         INCLUDE    "graphics/sprite.i"
  428.         INCLUDE    "graphics/view.i"
  429.         INCLUDE    "intuition/intuition.i"
  430.         INCLUDE    "libraries/lowlevel.i"
  431.         INCLUDE    "utility/utility.i"
  432.         INCLUDE    "libraries/nonvolatile.i"
  433.  
  434.         INCLUDE    "whdload.i"
  435.         INCLUDE    "whdmacros.i"    ; added for WHDLoad v10 includes
  436.  
  437.         IFD BARFLY
  438.         BOPT    O+ OG+            ;enable optimizing
  439.         BOPT    ODd- ODe-        ;disable mul optimizing
  440.         BOPT    w4-            ;disable 64k warnings
  441.         BOPT    wo-            ;disable optimizer warnings
  442.         SUPER                ;disable supervisor warnings
  443.         ENDC
  444.  
  445.         ORG    $400
  446.         OUTPUT    C:OSEmu.400
  447.  
  448.     ENDC
  449.  
  450.     IFD MR.LARMER                ;(devpac)
  451.         INCDIR    Include:
  452.         INCLUDE    devices/input.i
  453.         INCLUDE    devices/inputevent.i
  454.         INCLUDE    devices/keyboard.i
  455.         INCLUDE    devices/trackdisk.i
  456.         INCLUDE    dos/dos.i
  457.         INCLUDE    dos/doshunks.i
  458.         INCLUDE    dos/dosextens.i
  459.         INCLUDE    exec/memory.i
  460.         INCLUDE    graphics/gfx.i
  461.         INCLUDE    graphics/gfxbase.i
  462.         INCLUDE    graphics/rastport.i
  463.         INCLUDE    graphics/sprite.i
  464.         INCLUDE    graphics/view.i
  465.         INCLUDE    intuition/intuition.i
  466.         INCLUDE    utility/utility.i
  467.         INCLUDE    libraries/lowlevel.i
  468.         INCLUDE    libraries/nonvolatile.i
  469.         INCLUDE    lvo/cia_lib.i
  470.         INCLUDE    lvo/dos_lib.i
  471.         INCLUDE    lvo/exec_lib.i
  472.         INCLUDE    lvo/graphics_lib.i
  473.         INCLUDE    lvo/icon_lib.i
  474.         INCLUDE    lvo/intuition_lib.i
  475.         INCLUDE    lvo/layers_lib.i
  476.         INCLUDE    lvo/lowlevel_lib.i
  477.         INCLUDE    lvo/utility_lib.i
  478.         INCLUDE    lvo/mathffp_lib.i
  479.         INCLUDE    lvo/mathtrans_lib.i
  480. ;        INCLUDE    lvo/nonvolatile_lib.i
  481.         INCLUDE    whdload.i
  482.  
  483.         OPT    O+ OG+            ;enable optimizing
  484.         OPT    P=68020
  485.  
  486.         ORG    $400
  487.         OUTPUT    OSEmu.400
  488.     ENDC
  489.  
  490. USPLENGTH=$2000        ;reserved area for USP, enlarge if necessary
  491.  
  492. CORRECTDEVICES=1    ;if set 0, module will be assembled with
  493.             ;cut-down devices (no list connection, no
  494.             ;msgport of td.dev, no library-like device-
  495.             ;structure)
  496.  
  497. ; config bits for JST
  498. ; (WHDLoad has got its tags, why JST cannot have its ones :))
  499.  
  500. AFB_NTSC = 0
  501. AFB_NOOSSWAP = 4
  502.  
  503. ;---------------------------------------------------------------------------*
  504. **************************************************************************
  505. *   INITIALIZATION CALL                                                  *
  506. **************************************************************************
  507.  
  508.         bra    _Init
  509.         CNOP 0,4    ;essential for correct OSEmu-Structure !
  510.  
  511. **************************************************************************
  512. *   GLOBAL VARIABLES                                                     *
  513. **************************************************************************
  514.  
  515. ;-------------------------------------------------------------------------
  516. ; the following data are part of the OSEmu structure, the offsets of these
  517. ; data are guaranteed to remain unchanged for all future versions
  518.  
  519. VERSION = 1
  520. RELEASE = 12
  521.  
  522. OSM_SLVTRAINER    DC.L    0    ;OSEmu-Offset = 4
  523. OSM_LASTLOADSEG    dc.l    0    ;OSEmu-Offset = 8
  524. OSM_ID        dc.b    "OSEM"    ;OSEmu-Offset = 12 : added by JOTD
  525. OSM_VER        dc.w    VERSION    ;OSEmu-Offset = 16 : ""
  526.         dc.w    RELEASE    ;OSEmu-Offset = 18 : ""
  527. OSM_COPPERADDR    dc.l    0    ;OSEmu-Offset = 20 : "" 
  528. OSM_ICONIFYCODE    dc.l    0    ;OSEmu-Offset = 24 : ""
  529. OSM_ICONIFYKEY    dc.l    0    ;OSEmu-Offset = 28 : ""
  530. OSM_JSTFLAGS    dc.l    0    ;OSEmu-Offset = 32 : ""
  531. OSM_EXPMEM    dc.l    0    ;OSEmu-Offset = 36 : ""
  532. OSM_EXPSIZE    dc.l    0    ;OSEmu-Offset = 40 : ""
  533. OSM_DEBUGENTRY    dc.l    0    ;OSEmu-Offset = 44 : ""
  534.         dc.l    0,0,0,0,0,0,0,0    ; future use
  535. ; version string
  536.  
  537.     dc.b    "$VER: OSEmu v",VERSION+'0',".",RELEASE+'0',0
  538.     cnop    0,4
  539.  
  540. ;-------------------------------------------------------------------------
  541.  
  542. ALLOCMTABSIZE    DC.L    0        ; chip memory
  543. ALLOCFASTMTABSIZE    DC.L    0    ; fast memory
  544. _Slave        dc.l    0
  545. _RESLOAD    dc.l    0
  546. _dosbase    dc.l    0
  547. _gfxbase    dc.l    0
  548. _intbase    dc.l    0
  549. _ilibbase    dc.l    0
  550. _laybase    dc.l    0
  551. _mffpbase    dc.l    0
  552. _mtrbase    dc.l    0    ; added by JOTD
  553. _lowlbase    dc.l    0    ; added by JOTD
  554. _utilbase    dc.l    0    ; added by JOTD
  555. _keymbase    dc.l    0    ; added by JOTD
  556. _dskfbase    dc.l    0    ; added by JOTD
  557. _franbase    dc.l    0    ; added by JOTD
  558. _nonvbase    dc.l    0    ; added by JOTD
  559. _diskbase    dc.l    0    ; added by JOTD
  560. _ciaabase    dc.l    0
  561. _ciabbase    dc.l    0
  562. _inputhandler    dc.l    0            ;input.device handler (interrupt server structure)
  563. _inputevent    ds.b    ie_SIZEOF
  564. _tags        dc.l    WHDLTAG_ATTNFLAGS_GET
  565.         dc.w    0
  566. _attnflags    dc.w    0
  567.         dc.l    WHDLTAG_ECLOCKFREQ_GET
  568. _eclockfreq    dc.l    0
  569.         dc.l    WHDLTAG_MONITOR_GET
  570. _monitor    dc.l    0
  571.         dc.l    WHDLTAG_CHIPREVBITS_GET
  572. _chiprev    dc.l    0
  573.         dc.l    WHDLTAG_Private3
  574. _p3        dc.l    0
  575.         dc.l    0
  576.  
  577. _libtable    dc.l    _dosname,DOSINIT
  578.         dc.l    _gfxname,GFXINIT
  579.         dc.l    _intname,INTUIINIT
  580.         dc.l    _execname,EXEC2INIT
  581.         dc.l    _ilibname,ILIBINIT
  582.         dc.l    _layname,LAYERSINIT
  583.         dc.l    _mffpname,MATHFFPINIT
  584.         dc.l    _lowlname,LOWLINIT
  585.         dc.l    _franname,FRANINIT
  586.         dc.l    _mtrname,MATHTRANSINIT
  587.         dc.l    _nonvname,NONVINIT
  588.         dc.l    _utilname,UTILINIT
  589.         dc.l    _keymname,KEYMINIT
  590.         dc.l    _dskfname,DSKFINIT
  591.         dc.l    0
  592. _restable    dc.l    _ciaaname,CIAAINIT
  593.         dc.l    _ciabname,CIABINIT
  594.         dc.l    _diskname,DISKINIT
  595.         dc.l    0
  596.  
  597. _devtable
  598. _tddevtable    DC.L    _tdname,0
  599. _inpdevtable    DC.L    _inpname,0
  600. _auddevtable    DC.L    _audname,0
  601. _cddevtable    DC.L    _cdname,0
  602. _cdtvdevtable    DC.L    _cdtvname,0
  603. _kbdevtable    DC.L    _kbdevname,0
  604. _condevtable    DC.L    _condevname,0
  605.         DC.L    0
  606.  
  607. ; added by JOTD
  608. sec_timer:
  609.     dc.l    0
  610. millisec_timer:
  611.     dc.l    0
  612.  
  613. _last_joy0dat    dc.w    0
  614.  
  615. _sprites    ds.l    8
  616.  
  617. KBDVAL        DC.B    0
  618. _last_lmb    dc.b    0
  619. _last_rmb    dc.b    0
  620.  
  621. _mffpname    dc.b    'mathffp.library',0
  622. _layname    dc.b    'layers.library',0
  623. _ilibname    dc.b    'icon.library',0
  624. _execname    dc.b    "exec.library",0
  625. _dosname    dc.b    "dos.library",0
  626. _gfxname    dc.b    "graphics.library",0
  627. _intname    dc.b    "intuition.library",0
  628. _lowlname    dc.b    "lowlevel.library",0    ; added by JOTD
  629. _utilname    dc.b    "utility.library",0    ; added by JOTD
  630. _dskfname    dc.b    "diskfont.library",0    ; added by JOTD
  631. _keymname    dc.b    "keymap.library",0    ; added by JOTD
  632. _franname    dc.b    "freeanim.library",0    ; added by JOTD
  633. _nonvname    dc.b    "nonvolatile.library",0    ; added by JOTD
  634. _mtrname    dc.b    "mathtrans.library",0    ; added by JOTD
  635. _ciaaname    dc.b    "ciaa.resource",0
  636. _ciabname    dc.b    "ciab.resource",0
  637. _diskname    dc.b    "disk.resource",0
  638.     EVEN
  639. _tdname        dc.b    'trackdisk.device',0
  640.     EVEN
  641. _inpname    dc.b    'input.device',0
  642.     EVEN
  643. _audname    dc.b    'audio.device',0
  644.     EVEN
  645. _cdname        dc.b    'cd.device',0
  646.     EVEN
  647. _cdtvname    dc.b    'cdtv.device',0
  648.     EVEN
  649. _kbdevname    dc.b    'keyboard.device',0
  650.     EVEN
  651. _condevname    dc.b    'console.device',0
  652.     EVEN
  653.  
  654. ;task gets a process structure
  655.  
  656. _EXECLIBTASK    DC.L    0
  657.         DC.L    0
  658.         DC.B    NT_TASK
  659.         DC.B    0
  660.         DC.L    _execname
  661.         DC.B    0
  662.         DC.B    TS_RUN
  663.         DC.B    0
  664.         DC.B    0
  665.         DC.L    0        ;TC_SIGALLOC
  666.         DC.L    0
  667.         DC.L    0
  668.         DC.L    0
  669.         DC.W    0
  670.         DC.W    0
  671.         DC.L    0
  672.         DC.L    0
  673.         DC.L    0
  674.         DC.L    0
  675.         DC.L    0
  676.         DC.L    0
  677.         DC.L    0
  678.         DC.L    0
  679.         DC.L    0
  680.  
  681.         DC.L    0
  682.         DC.L    0
  683.         DC.L    0
  684.         DC.B    0
  685.         DC.B    0
  686.  
  687.         DC.L    0
  688.  
  689. _EXECLIBMSGPORT    DC.L    0        ;MUST FOLLOW DIRECTLY TO TASK
  690.         DC.L    0        ;CC3 EXPECTS THAT SO
  691.         DC.B    NT_MSGPORT
  692.         DC.B    0
  693.         DC.L    0
  694.  
  695.         DC.B    PA_SIGNAL
  696.         DC.B    0        ;BIT 0 AS SIGNALBIT
  697.         DC.L    _EXECLIBTASK
  698.  
  699.         DC.L    0        ;NO MESSAGES YET
  700.         DC.L    0
  701.         DC.L    0
  702.         DC.B    NT_MESSAGE
  703.         DC.B    0
  704.  
  705.  
  706.         DC.W    0
  707.         DC.L    $EEEEEEEE    ;INVALID SEGLIST
  708.         DC.L    USPLENGTH-$20
  709.         DC.L    $EEEEEEEC    ;INVALID GLOBVEC
  710.         DC.L    1
  711.         DC.L    0
  712.         DC.L    0
  713.         DC.L    $EEEEEEEA
  714.         DC.L    0
  715.         DC.L    0
  716.         DC.L    $EEEEEEEE
  717.         DC.L    $EEEEEEEE
  718. _bcplcorrect1    DC.L    _CLI
  719.         DC.L    $EEEEEEEE
  720.         DC.L    0
  721.         DC.L    -1
  722. _EXECLIBPROCESS_SIZEOF
  723.  
  724.     IFNE    _EXECLIBMSGPORT-_EXECLIBTASK-$5C
  725.     FAIL
  726.     ENDC
  727.  
  728.     IFNE    _EXECLIBPROCESS_SIZEOF-_EXECLIBTASK-$BC
  729.     FAIL
  730.     ENDC
  731.  
  732.  
  733.     CNOP    0,4
  734. _CLI        DC.L    0
  735.         DC.L    $EEEEEEE
  736.         DC.L    $EEEEEEE
  737.         DC.L    0
  738. _bcplcorrect2    DC.L    _ANIMNAME
  739.         DC.L    20
  740.         DC.L    $EEEEEEE
  741.         DC.L    $EEEEEEE
  742.         DC.L    $EEEEEEE
  743.         DC.L    $EEEEEEE
  744.         DC.L    0
  745.         DC.L    0
  746.         DC.L    $EEEEEEE
  747.         DC.L    USPLENGTH-$20
  748.         DC.L    $EEEEEEE
  749.         DC.L    $EEEEEEE
  750.  
  751.     CNOP    0,4
  752. _ANIMNAME    DC.B    8,'df0:anim',0
  753.  
  754.     EVEN
  755.  
  756. _EXECMINSIZE
  757.  
  758.     DS.B    822        ;-_LVOExecReserved08
  759.  
  760. _EXECLIBBASE
  761.     DC.L    _LIBLIST+4
  762.     DC.L    _LIBLIST
  763.     DC.B    NT_LIBRARY
  764.     DC.B    0
  765.     DC.L    _execname
  766.                     ;end of node structure
  767.     DC.B    4
  768.     DC.B    $EE
  769.     DC.W    -_LVOCopyMemQuick
  770.     DC.W    $24C
  771.     DC.W    $28            ;version of exec.lib=KS3.1
  772.     DC.W    $0A            ;subversion
  773.     DC.L    $EEEEEEEE
  774.     DC.L    $EEEEEEEE
  775.     DC.W    0
  776.                     ;end of library structure
  777.     DC.W    $44            ;version: KS3.1
  778.     DC.W    $EEEE
  779.     DC.L    $EEEEEEEE
  780.     DC.L    $EEEEEEEE
  781.     DC.L    $EEEEEEEE
  782.     DC.L    $EEEEEEEE
  783.     DC.L    0
  784.     DC.L    0
  785.     DC.L    0
  786.     DC.L    0
  787.     DC.L    0
  788.     DC.L    $EEEEEEEE
  789.     DC.L    0
  790.     DC.W    $EEEE    
  791.  
  792.     DC.L    $DDDDDDDD
  793.     DC.L    $DDDDDDDD
  794.     DC.L    $DDDDDDDD
  795.  
  796.     DC.L    $DDDDDDDD
  797.     DC.L    $DDDDDDDD
  798.     DC.L    $DDDDDDDD
  799.  
  800.     DC.L    $DDDDDDDD
  801.     DC.L    $DDDDDDDD
  802.     DC.L    $DDDDDDDD
  803.  
  804.     DC.L    $DDDDDDDD
  805.     DC.L    $DDDDDDDD
  806.     DC.L    $DDDDDDDD
  807.  
  808.     DC.L    $DDDDDDDD
  809.     DC.L    $DDDDDDDD
  810.     DC.L    $DDDDDDDD
  811.  
  812.     DC.L    $DDDDDDDD
  813.     DC.L    $DDDDDDDD
  814.     DC.L    $DDDDDDDD
  815.  
  816.     DC.L    $DDDDDDDD
  817.     DC.L    $DDDDDDDD
  818.     DC.L    $DDDDDDDD
  819.  
  820.     DC.L    $DDDDDDDD
  821.     DC.L    $DDDDDDDD
  822.     DC.L    $DDDDDDDD
  823.  
  824.     DC.L    $DDDDDDDD
  825.     DC.L    $DDDDDDDD
  826.     DC.L    $DDDDDDDD
  827.  
  828.     DC.L    $DDDDDDDD
  829.     DC.L    $DDDDDDDD
  830.     DC.L    $DDDDDDDD
  831.  
  832.     DC.L    $DDDDDDDD
  833.     DC.L    $DDDDDDDD
  834.     DC.L    $DDDDDDDD
  835.  
  836.     DC.L    $DDDDDDDD
  837.     DC.L    $DDDDDDDD
  838.     DC.L    $DDDDDDDD
  839.  
  840.     DC.L    $DDDDDDDD
  841.     DC.L    $DDDDDDDD
  842.     DC.L    $DDDDDDDD
  843.  
  844.     DC.L    $DDDDDDDD
  845.     DC.L    $DDDDDDDD
  846.     DC.L    $DDDDDDDD
  847.  
  848.     DC.L    $DDDDDDDD
  849.     DC.L    $DDDDDDDD
  850.     DC.L    $DDDDDDDD
  851.  
  852.     DC.L    $DDDDDDDD
  853.     DC.L    $DDDDDDDD
  854.     DC.L    $DDDDDDDD
  855.  
  856.     DC.L    _EXECLIBTASK
  857.     DC.L    $EEEEEEEE
  858.     DC.L    $EEEEEEEE
  859.     DC.W    $EEEE
  860.     DC.W    $DDDD
  861.     DC.W    $EEEE
  862.     DC.B    -1
  863.     DC.B    -1
  864.     DC.W    0
  865.     DC.W    $EEEE
  866.     DC.L    $EEEEEEEE
  867.     DC.L    $EEEEEEEE
  868.     DC.L    $EEEEEEEE
  869.     DC.L    $EEEEEEEE
  870.     DC.L    $EEEEEEEE        ;DUMMY, NORMALLY ALLOCATED SIGNALS
  871.     DC.W    $EEEE
  872.  
  873.     DC.L    $EEEEEEEE
  874.     DC.L    $EEEEEEEE
  875.     DC.L    $EEEEEEEE
  876.     DC.W    $EEEE
  877.  
  878.     DC.L    $EEEEEEEE
  879.     DC.L    $EEEEEEEE
  880.     DC.L    $EEEEEEEE
  881.     DC.W    $EEEE
  882.  
  883.     IFNE    CORRECTDEVICES
  884. _DEVLISTC    DC.L    _DEVLISTC+4
  885.         DC.L    0
  886.         DC.L    _DEVLISTC
  887.         DC.B    NT_DEVICE
  888.         DC.B    0
  889.     ELSE
  890.         DC.L    $EEEEEEEE        ;DEVICELIST
  891.         DC.L    $EEEEEEEE
  892.         DC.L    $EEEEEEEE
  893.         DC.W    $EEEE
  894.     ENDC
  895.  
  896.     DC.L    $EEEEEEEE
  897.     DC.L    $EEEEEEEE
  898.     DC.L    $EEEEEEEE
  899.     DC.W    $EEEE
  900.  
  901. _LIBLIST    DC.L    _EXECLIBBASE
  902.         DC.L    0
  903.         DC.L    _EXECLIBBASE
  904.         DC.B    NT_LIBRARY
  905.         DC.B    0
  906.  
  907.     DC.L    $EEEEEEEE
  908.     DC.L    $EEEEEEEE
  909.     DC.L    $EEEEEEEE
  910.     DC.W    $EEEE
  911.  
  912. _TASKREADYLIST    DC.L    _TASKREADYLIST+4
  913.         DC.L    0
  914.         DC.L    _TASKREADYLIST
  915.         DC.B    NT_TASK
  916.         DC.B    0
  917.  
  918.     DC.L    $EEEEEEEE
  919.     DC.L    $EEEEEEEE
  920.     DC.L    $EEEEEEEE
  921.     DC.W    $EEEE
  922.  
  923.     DC.L    $EEEEEEEE
  924.     DC.L    $EEEEEEEE
  925.     DC.L    $EEEEEEEE
  926.     DC.L    $EEEEEEEE
  927.  
  928.     DC.L    $EEEEEEEE
  929.     DC.L    $EEEEEEEE
  930.     DC.L    $EEEEEEEE
  931.     DC.L    $EEEEEEEE
  932.  
  933.     DC.L    $EEEEEEEE
  934.     DC.L    $EEEEEEEE
  935.     DC.L    $EEEEEEEE
  936.     DC.L    $EEEEEEEE
  937.  
  938.     DC.L    $EEEEEEEE
  939.     DC.L    $EEEEEEEE
  940.     DC.L    $EEEEEEEE
  941.     DC.L    $EEEEEEEE
  942.  
  943.     DC.L    $EEEEEEEE
  944.     DC.L    $EEEEEEEE
  945.     DC.L    $EEEEEEEE
  946.     DC.L    $EEEEEEEE
  947.  
  948.     DC.L    $EEEEEEEE
  949.     DC.L    $EEEEEEEE
  950.     DC.L    $EEEEEEEE
  951.     DC.L    $EEEEEEEE
  952.  
  953.     DC.B    $EE            ;VBLANK FREQU
  954.     DC.B    $EE            ;POWER SUPPLY FREQU
  955.     
  956.     DC.L    $EEEEEEEE
  957.     DC.L    $EEEEEEEE
  958.     DC.L    $EEEEEEEE
  959.     DC.W    $EEEE
  960.  
  961.     DC.L    $EEEEEEEE
  962.     DC.L    $EEEEEEEE
  963.     DC.W    $EEEE
  964.  
  965.     DS.B    12
  966.     DS.B    20
  967.     DS.B    $2C
  968. _EMAXSIZE
  969.  
  970.     IFNE    _EMAXSIZE-_EXECLIBBASE-$278
  971.     FAIL
  972.     ENDC
  973.  
  974.  
  975.     IFNE    CORRECTDEVICES
  976. _TDDMSGPORT
  977.     DC.L    0
  978.     DC.L    0
  979.     DC.B    NT_MSGPORT
  980.     DC.B    0
  981.     DC.L    _tdname
  982.  
  983.     dc.b    0
  984.     dc.b    0
  985.     DC.L    _EXECLIBTASK
  986.  
  987.     DC.L    0
  988.     DC.L    0
  989.     DC.L    0
  990.     DC.B    NT_MESSAGE
  991.     DC.B    0
  992.  
  993.     DC.L    1            ;DUE LORDS OF WAR -UNDOCUMENTED-
  994.  
  995.     ENDC
  996.  
  997.     cnop    0,4
  998. _DummyCList:                ; added by JOTD
  999.     dc.l    $FFFFFFFE
  1000.  
  1001. **************************************************************************
  1002. *   VERSION                                                              *
  1003. **************************************************************************
  1004.  
  1005.     IFND BARFLY
  1006.         DC.B    '$VER: OS_EMUMODULE 0.26 +DEV (05-dec-1998 8:00:00)',0
  1007.     ELSE
  1008.         dc.b    "$VER: OSEmu "
  1009.         DOSCMD    "WDate >T:date"
  1010.         INCBIN    "T:date"
  1011.         dc.b    0
  1012.         dc.b    "$Id: osemu.asm 1.2 1999/02/03 04:10:48 jotd Exp jotd $"
  1013.     ENDC
  1014.     EVEN
  1015.  
  1016. **************************************************************************
  1017. *   GLOBAL INITIALIZATION                                                *
  1018. **************************************************************************
  1019. ;REQUIRES NOW AT LEAST WHDLOAD 7.0
  1020. ;ALTHOUGH THERE IS NO MULTITASKING IMPLEMENTED AT THE MOMENT,
  1021. ;ALL FUNCTIONS MUST BE IMPLEMENTED REENTRANTLY
  1022. ;
  1023. ; IN:    A0 = resload base
  1024. ;    A1 = pointer to slave structure
  1025. ; OUT:    A1 = ioreq of trackdisk.device
  1026. ;    A6 = execbase
  1027.  
  1028. _Init        movem.l    d0-a0/a2-a5,-(a7)
  1029.  
  1030.         cmp.w    #7,(ws_Version,a1)    ;minimum version
  1031.         blo    _ill
  1032.  
  1033.         move.l    a0,_RESLOAD
  1034.         move.l    a1,(_Slave)
  1035.  
  1036.     ;install a default copperlist
  1037.  
  1038.         move.l    #_DummyCList,(_custom+cop1lc)
  1039.  
  1040.     ;correct structures
  1041. BCPLCORRECT    MACRO
  1042.         move.l    \1,d0
  1043.         lsr.l    #2,d0
  1044.         move.l    d0,\1
  1045.         ENDM
  1046.         BCPLCORRECT    _bcplcorrect1
  1047.         BCPLCORRECT    _bcplcorrect2
  1048.  
  1049.     ;init memory managment
  1050.  
  1051.     ; chip memory
  1052.  
  1053.         lea    _osemu_end,a0        ;FIRST CLEAR WHOLE TABLE (MARK MEM AS USED)
  1054.         move.l    (ws_BaseMemSize,a1),d0
  1055.         SUBQ.L    #8,D0
  1056.         LSR.L    #3,D0            ;OK, AMOUNT OF BITS TO CLEAR IS IN D0
  1057.         LSR.L    #3,D0            ;AMOUNT OF BYTES TO CLEAR IN D0
  1058. .1        CLR.B    (A0)+
  1059.         SUBQ.L    #1,D0
  1060.         BPL.S    .1
  1061.         MOVE.L    A0,ALLOCMTABSIZE
  1062.         move.l    (ws_BaseMemSize,a1),d0
  1063.         SUB.L    A0,D0
  1064.         SUB.L    #$1000,D0        ;$1000 SYSTEM STACK ON TOP
  1065.         MOVE.L    A0,A1            ;FREE APPROPRIATE SIZE
  1066.         BSR    FREEM
  1067.  
  1068.     ; fast memory if available
  1069.  
  1070. ;;    clr.l    OSM_EXPMEM
  1071.  
  1072.         move.l    OSM_EXPMEM,a0        ;FIRST CLEAR WHOLE TABLE (MARK MEM AS USED)
  1073.         cmp.l    #0,A0
  1074.         beq.b    .nofast
  1075.     
  1076.         move.l    OSM_EXPSIZE,d0
  1077.         SUBQ.L    #8,D0
  1078.         LSR.L    #3,D0            ;OK, AMOUNT OF BITS TO CLEAR IS IN D0
  1079.         LSR.L    #3,D0            ;AMOUNT OF BYTES TO CLEAR IN D0
  1080. .2        CLR.B    (A0)+
  1081.         SUBQ.L    #1,D0
  1082.         BPL.S    .2
  1083.         MOVE.L    A0,ALLOCFASTMTABSIZE    ; not real size!
  1084.  
  1085.         move.l    OSM_EXPSIZE,d0
  1086.         add.l    OSM_EXPMEM,D0        ; adds expbase
  1087.         SUB.L    A0,D0            ; substracts expbase+tabsize
  1088.         SUB.L    #$100,D0        ;$100 safety
  1089.  
  1090.         MOVE.L    A0,A1            ;FREE APPROPRIATE SIZE
  1091.         BSR    FREEM
  1092.  
  1093. .nofast:
  1094.     ;allocate stack
  1095.         move.l    #USPLENGTH,d0
  1096.         moveq    #MEMF_PUBLIC,d1    ; MEMF_CHIP removed
  1097.         bsr    ALLOCM
  1098.         move.l    d0,a0
  1099.         MOVE.L    A0,_EXECLIBTASK+TC_SPLOWER
  1100.         add.l    #USPLENGTH-4,a0
  1101.         move.l    a0,usp
  1102.         MOVE.L    A0,_EXECLIBTASK+pr_StackBase
  1103.         MOVE.L    #USPLENGTH-$20,(A0)+
  1104.         MOVE.L    A0,_EXECLIBTASK+TC_SPUPPER
  1105.  
  1106.     ;get whdload vars
  1107.         lea    _tags,a0
  1108.         move.l    _RESLOAD,a1
  1109.         jsr    (resload_Control,a1)
  1110.  
  1111.     ;init libraries
  1112.         bsr    CIAAINIT        ;required because int handling
  1113.         bsr    CIABINIT        ;required because int handling
  1114.         bsr    EXECINIT
  1115.         bsr    GFXINIT            ;required for display init (copper)
  1116.         IFNE    CORRECTDEVICES
  1117.         BSR.W    MAKEDEVICELIST
  1118.         ENDC
  1119.         move.w    #INTF_SETCLR!INTF_INTEN!INTF_EXTER!INTF_VERTB!INTF_PORTS,(_custom+intena)
  1120.  
  1121.  
  1122.     ;flush caches
  1123.         move.l    (_RESLOAD),a0
  1124.         jsr    (resload_FlushCache,a0)
  1125.  
  1126.     ;prepare return values
  1127.         move.l    (4),a6
  1128.         move.l    #$400+IOTD_SIZE,d0
  1129.         moveq    #0,d1
  1130.         jsr    (_LVOAllocMem,a6)
  1131.         move.l    d0,a2
  1132.         lea    (_tdname),a0
  1133.         moveq    #0,d0
  1134.         move.l    a2,a1
  1135.         moveq    #0,d1
  1136.         jsr    (_LVOOpenDevice,a6)
  1137.         move.l    a2,a1
  1138.         lea    (IOTD_SIZE,a2),a0
  1139.         move.l    a0,(IO_DATA,a1)
  1140.         move.l    #$400,(IO_LENGTH,a1)
  1141.         clr.l    (IO_OFFSET,a1)
  1142.         move.w    #CMD_READ,(IO_COMMAND,a1)
  1143.  
  1144.         movem.l    (a7)+,d0-a0/a2-a5
  1145.  
  1146.         rts
  1147.  
  1148. ; Added by JOTD: enter debugger (useful for debugging with JST)
  1149.  
  1150. EnterDebugger:
  1151.     move.l    A0,-(A7)
  1152.     move.l    OSM_DEBUGENTRY,A0
  1153.     cmp.l    #0,A0
  1154.     beq.b    .exit
  1155.     jsr    (A0)
  1156. .exit
  1157.     move.l    (A7)+,A0
  1158.     rts
  1159.  
  1160. **************************************************************************
  1161. *   MISC FUNCTIONS                                                       *
  1162. **************************************************************************
  1163. ;-----------------------------------------------
  1164. ; IN:    D0 = ULONG size of jmp table
  1165. ;    D1 = ULONG size of variable area
  1166. ;    A0 = CPTR  subsystem name
  1167. ; OUT:    D0 = APTR  librarybase
  1168.  
  1169. _InitStruct    movem.l    d0-d1/a0,-(a7)
  1170.         add.l    d1,d0
  1171.         moveq    #MEMF_CHIP,d1        ;changed by JOTD
  1172.         bsr    ALLOCM
  1173.         move.l    d0,a0            ;jmp table start
  1174.                 move.l    d0,a1
  1175.         add.l    (a7),a1            ;jmp table end
  1176.  
  1177.         lea    _LVOFail,a2
  1178. .1        move.w    #$4EB9,(A0)+
  1179.         move.l    a2,(a0)+
  1180.         cmp.l    a0,a1
  1181.         bhi    .1
  1182.         move.l    (8,a7),-4(a0)        ;name of library
  1183.         move.l    a0,(A7)            ;library base
  1184.         move.l    a0,a1            ;variables start
  1185.         add.l    (4,a7),a1        ;variables end
  1186. .2        move.w    #$eeee,(a0)+
  1187.         cmp.l    a0,a1
  1188.         bhi    .2
  1189.         MOVEM.L    (A7)+,D0/D1/A0
  1190.         rts
  1191.  
  1192. _InitLibrary    BSR.S    _InitStruct
  1193.         MOVE.L    D0,A1
  1194.         MOVE.B    #NT_LIBRARY,LN_TYPE(A1)
  1195.         SF    LN_PRI(A1)
  1196.         move.l    A0,LN_NAME(A1)        ;name of library
  1197.         LEA.L    _LIBLIST(PC),A0
  1198.         BSR.W    _ADDTAIL
  1199.         rts
  1200.  
  1201.     IFNE    CORRECTDEVICES
  1202. _InitDevice    BSR.S    _InitStruct
  1203.         MOVE.L    D0,A1
  1204.         MOVE.B    #NT_LIBRARY,LN_TYPE(A1)
  1205.         SF    LN_PRI(A1)
  1206.         move.l    A0,LN_NAME(A1)        ;name of library
  1207.         LEA.L    _DEVLISTC(PC),A0
  1208.         BSR.W    _ADDTAIL
  1209.         rts
  1210.     ENDC
  1211.  
  1212. _LVOFail    exg.l    d0,a6
  1213.         sub.l    d0,(a7)            ;LVO
  1214.         exg.l    d0,a6
  1215.         subq.l    #6,(a7)
  1216.         move.l    (-4,a6),-(a7)        ;name of library
  1217. _emufail    pea    TDREASON_OSEMUFAIL
  1218.         move.l    _RESLOAD(pc),-(a7)
  1219.         addq.l    #resload_Abort,(a7)
  1220. _rts        rts
  1221.  
  1222. EMUFAIL        MACRO
  1223.         pea    \1
  1224.         pea    \2
  1225.         bra    _emufail
  1226.         ENDM
  1227. EXECFAIL    MACRO
  1228.         EMUFAIL    \1,_execname
  1229.         ENDM
  1230. GFXFAIL        MACRO
  1231.         EMUFAIL    \1,_gfxname
  1232.         ENDM
  1233.  
  1234. ;-----------------------------------------------
  1235. ; IN:    A0 = CPTR  string 1
  1236. ;    A0 = CPTR  string 2
  1237. ; OUT:    D0 = LONG  0 if strings are equal
  1238.  
  1239. _strcmp        movem.l    a0-a1,-(a7)
  1240. .1        cmpm.b    (a0)+,(a1)+
  1241.         bne    .not
  1242.         tst.b    (-1,a0)
  1243.         bne    .1
  1244.         move    #0,d0
  1245.         movem.l    (a7)+,a0-a1
  1246.         rts
  1247.  
  1248. .not        moveq    #-1,d0
  1249.         movem.l    (a7)+,a0-a1
  1250.         rts
  1251.  
  1252. ;-----------------------------------------------
  1253. ; wait for vertical blank
  1254.  
  1255. _waitvb
  1256. .1        btst    #0,(_custom+vposr+1)
  1257.         beq    .1
  1258. .2        btst    #0,(_custom+vposr+1)
  1259.         bne    .2
  1260.         rts
  1261.  
  1262. _ill        illegal
  1263.  
  1264. **************************************************************************
  1265. *   EXEC LIBRARY                                                         *
  1266. **************************************************************************
  1267.  
  1268. EXEC2INIT
  1269.     move.l    A6,D0    ; NightShift tries to open exec.library!
  1270.     rts
  1271.  
  1272. **************************************************************************
  1273. *   INITIALIZATION                                                       *
  1274. **************************************************************************
  1275.  
  1276. EXECINIT
  1277.     ;    move.l    4,d0
  1278.     ;    btst    #0,d0
  1279.     ;    bne    .init
  1280.     ;    rts
  1281.  
  1282. .init        lea    _EXECMINSIZE(PC),A0
  1283.         LEA.L    _EXECLIBBASE(PC),A1
  1284.         lea    _LVOFail,a2
  1285. .1        move.w    #$4EB9,(A0)+
  1286.         move.l    a2,(a0)+
  1287.         cmp.l    a0,a1
  1288.         bhi    .1
  1289.         move.l    #_execname,-4(a0)    ;name of library
  1290.         MOVE.L    a1,a0
  1291.         move.l    a0,$4.W
  1292.         
  1293.         patch    _LVOOldOpenLibrary(a0),OPENLIB(pc)
  1294.         patch    _LVOOpenLibrary(a0),OPENLIB(pc)
  1295.         patch    _LVOCloseLibrary(A0),MYRTS(PC)
  1296.  
  1297.         patch    _LVOAllocMem(a0),ALLOCM(PC)
  1298.         patch    _LVOFreeMem(a0),FREEM(PC)
  1299.         patch    _LVOAvailMem(a0),AVAILM(PC)
  1300.         patch    _LVOTypeOfMem(a0),TYPEOFMEM(PC)
  1301.         patch    _LVOAllocAbs(a0),ALLOCA(PC)
  1302.         patch    _LVOCopyMem(A0),_COPYMEM(PC)
  1303.         patch    _LVOAllocEntry(a0),ALLOCENTRY(PC)
  1304.         patch    _LVOFreeEntry(a0),FREEENTRY(PC)
  1305.  
  1306.         patch    _LVOForbid(a0),MYRTS(PC)
  1307.         patch    _LVOPermit(a0),MYRTS(PC)
  1308.         patch    _LVOSetIntVector(A0),_SETINTVECTOR(PC)
  1309.         patch    _LVOAddIntServer(a0),_AddIntServer(PC)
  1310.         patch    _LVORemIntServer(a0),_RemIntServer(PC)
  1311.         patch    -$24(A0),_ExitIntr(PC)
  1312.     ;    patch    _LVOEnqueue(a0),_Enqueue(PC)
  1313.         patch    _LVOOpenResource(a0),OPENRES(PC)
  1314.         patch    _LVOSupervisor(a0),_Supervisor(PC)
  1315.         patch    _LVOSuperState(a0),_SuperState(PC)
  1316.         patch    _LVOUserState(a0),_UserState(PC)
  1317.         patch    _LVOFindTask(a0),_FINDTASK(PC)
  1318.         patch    _LVORemTask(a0),MYRTS(PC)
  1319.         patch    _LVOSetTaskPri(A0),MYRTZ(PC)
  1320.  
  1321.         patch    _LVOAddPort(a0),MYRTS(PC)
  1322.         patch    _LVOOpenDevice(a0),_OpenDevice(PC)
  1323.         patch    _LVODoIO(a0),_DoIO(PC)
  1324.         patch    _LVOWaitIO(A0),_WAITIO(PC)    ; uncommented by JOTD
  1325.         patch    _LVOAbortIO(A0),_ABORTIO(PC)
  1326.         patch    _LVOCheckIO(A0),_CHECKIO(PC)    ; added by JOTD
  1327.         patch    _LVOSendIO(a0),_SendIO(PC)
  1328.         patch    _LVOCloseDevice(a0),MYRTS(PC)
  1329.         patch    _LVORemPort(a0),MYRTS(PC)
  1330.  
  1331.         patch    _LVOAllocSignal(a0),_AllocSignal(PC)
  1332.         patch    _LVOFreeSignal(a0),_FreeSignal(PC)
  1333.         patch    _LVOSetSignal(a0),_SetSignal(PC)
  1334.         patch    _LVODisable(a0),_Disable(PC)
  1335.         patch    _LVOEnable(a0),_Enable(PC)
  1336.         patch    _LVOWaitPort(A0),MYRTS(PC)
  1337.         patch    _LVOGetMsg(A0),MYRTZ(PC)
  1338.         patch    _LVOCreateIORequest(A0),_CreateIORequest(PC)
  1339.         patch    _LVODeleteIORequest(A0),_DeleteIORequest(PC)
  1340.         patch    _LVOCreateMsgPort(A0),_CreateMsgPort(PC)
  1341.         patch    _LVODeleteMsgPort(A0),_DeleteMsgPort(PC)
  1342.  
  1343.         patch    _LVOInsert(A0),_INSERT(PC)
  1344.         patch    _LVOAddHead(A0),_ADDHEAD(PC)
  1345.         patch    _LVOAddTail(A0),_ADDTAIL(PC)
  1346.         patch    _LVORemove(A0),_REMOVE(PC)
  1347.         patch    _LVORemHead(A0),_REMHEAD(PC)
  1348.         patch    _LVORemTail(A0),_REMTAIL(PC)
  1349.         patch    _LVOFindName(A0),_FINDNAME(PC)
  1350.  
  1351.         patch    _LVOCacheControl(A0),MYRTZ(PC)    ; added by JOTD
  1352.         patch    _LVOCacheClearU(A0),_CacheClearU(PC)    ; added by JOTD
  1353.         patch    _LVOSetFunction(A0),_SetFunction(PC)    ; added by JOTD
  1354.         patch    _LVOFindResident(A0),_FindResident(PC)    ; added by JOTD
  1355.  
  1356.         move.w    (_attnflags),(AttnFlags,a0)
  1357.  
  1358.         MOVE.L    _Slave(PC),A1
  1359.         MOVE.L    ws_BaseMemSize(A1),A1
  1360.         MOVE.L    A1,SysStkUpper(A0)
  1361.         MOVE.L    A1,MaxLocMem(A0)
  1362.         LEA.L    -$1000(A1),A1
  1363.         MOVE.L    A1,SysStkLower(A0)
  1364.         MOVE.L    _monitor(PC),D0
  1365.         MOVEQ.L    #60,D1
  1366.         AND.L    #$FFFF1000,D0
  1367.         CMP.L    #$21000,D0
  1368.         BNE.S    .nopal
  1369.         moveq.l    #50,D1
  1370. .nopal
  1371.         move.b    d1,VBlankFrequency(A0)
  1372.  
  1373.     ;clear int table
  1374.         lea    (IntVects,a0),a1
  1375.         moveq    #16*IV_SIZE/4-1,d0
  1376. .c1        MOVE.L    #$DDDDDDDD,(a1)+
  1377.         dbf    d0,.c1
  1378.     ;init int table
  1379.         LEA.L    (IVPORTS,A0),A1
  1380.         MOVE.L    A1,(IV_DATA,a1)
  1381.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1382.         move.l    #INTSERVNODE_CIAA,(IV_NODE,a1)
  1383.  
  1384.         LEA.L    (IVCOPER,A0),A1
  1385.         MOVE.L    A1,(IV_DATA,a1)
  1386.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1387.         CLR.L    (IV_NODE,a1)
  1388.  
  1389.         LEA.L    (IVVERTB,A0),A1
  1390.         MOVE.L    A1,(IV_DATA,a1)
  1391.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1392.         CLR.L    (IV_NODE,a1)
  1393.  
  1394.         LEA.L    (IVEXTER,A0),A1
  1395.         MOVE.L    A1,(IV_DATA,a1)
  1396.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1397.         move.l    #INTSERVNODE_CIAB,(IV_NODE,a1)
  1398.  
  1399.         LEA.L    (IVAUD0,A0),A1
  1400.         MOVE.L    A1,(IV_DATA,a1)
  1401.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1402.         move.l    #INTSERVNODE_AUDIO0,(IV_NODE,a1)
  1403.  
  1404.         LEA.L    (IVAUD1,A0),A1
  1405.         MOVE.L    A1,(IV_DATA,a1)
  1406.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1407.         move.l    #INTSERVNODE_AUDIO1,(IV_NODE,a1)
  1408.  
  1409.         LEA.L    (IVAUD2,A0),A1
  1410.         MOVE.L    A1,(IV_DATA,a1)
  1411.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1412.         move.l    #INTSERVNODE_AUDIO2,(IV_NODE,a1)
  1413.  
  1414.         LEA.L    (IVAUD3,A0),A1
  1415.         MOVE.L    A1,(IV_DATA,a1)
  1416.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1417.         move.l    #INTSERVNODE_AUDIO3,(IV_NODE,a1)
  1418.  
  1419.     ;init hardware ints
  1420.         move.l    #INT_68,$68
  1421.         move.l    #INT_6c,$6c
  1422.         MOVE.L    #INT_70,$70
  1423.         move.l    #INT_78,$78
  1424.  
  1425.         move.b    #$1f,$bfed01
  1426.         MOVE.B    #$8F,$BFED01
  1427.         tst.B    $BFED01
  1428.         move.b    #$1f,$bfdd00
  1429. ;        MOVE.B    #$87,$BFDD00    ; OS not enable TOD int (Mr.Larmer)
  1430.         MOVE.B    #$83,$BFDD00
  1431.         tst.b    $bfdd00
  1432.         
  1433.         move.w    #$7fff,(_custom+intena)
  1434.  
  1435.         rts
  1436.  
  1437.     IFNE    CORRECTDEVICES
  1438. MAKEDEVICELIST
  1439.         MOVE.L    4.W,A0
  1440.         move.l    #$24,d0
  1441. ;        move.l    #LIB_SIZE,d1
  1442.         move.l    #LIB_SIZE+$a,d1
  1443.         lea    _tdname(PC),a0
  1444.         bsr    _InitDevice
  1445.         MOVE.L    d0,_tddevtable+4
  1446.         MOVE.L    D0,A0
  1447.         CLR.L    $28(A0)            ;DUE LORDS OF WAR
  1448.         MOVE.L    #_TDDMSGPORT,$24(A0)    ;-"-
  1449.         move.l    #$24,d0
  1450.         move.l    #LIB_SIZE,d1
  1451.         lea    _inpname(PC),a0
  1452.         bsr    _InitDevice
  1453.         MOVE.L    d0,_inpdevtable+4
  1454.         move.l    #$24,d0
  1455.         move.l    #LIB_SIZE,d1
  1456.         lea    _audname(PC),a0
  1457.         bsr    _InitDevice
  1458.         MOVE.L    d0,_auddevtable+4
  1459.  
  1460.         MOVE.L    D0,A0
  1461.         patch    -$1E(A0),_SENDAUDIO(PC)
  1462.  
  1463.         move.l    #$24,d0        ; cd.device, added by JOTD
  1464.         move.l    #LIB_SIZE,d1
  1465.         lea    _cdname(PC),a0
  1466.         bsr    _InitDevice
  1467.         MOVE.L    d0,_cddevtable+4
  1468.  
  1469.         move.l    #$24,d0        ; cdtv.device, added by JOTD
  1470.         move.l    #LIB_SIZE,d1
  1471.         lea    _cdtvname(PC),a0
  1472.         bsr    _InitDevice
  1473.         MOVE.L    d0,_cdtvdevtable+4
  1474.  
  1475.         move.l    #$24,d0        ; dummy console.device
  1476.         move.l    #LIB_SIZE,d1
  1477.         lea    _condevname(PC),a0
  1478.         bsr    _InitDevice
  1479.         MOVE.L    d0,_condevtable+4
  1480.  
  1481.         move.l    #$24,d0
  1482. ;        move.l    #LIB_SIZE,d1
  1483.         move.l    #$14C,d1
  1484.         lea    _kbdevname(PC),a0
  1485.         bsr    _InitDevice
  1486.         MOVE.L    d0,_kbdevtable+4
  1487.  
  1488.         move.l    d0,INTSERVNODE_SP+IS_DATA
  1489.  
  1490.         move.l    d0,a0
  1491.         lea    $70(a0),a0
  1492.         move.l    #$14C-$70-1,d0
  1493. .clear
  1494.         clr.b    (a0)+
  1495.         dbf    d0,.clear
  1496.  
  1497.         RTS
  1498.  
  1499.     ENDC
  1500.  
  1501. MYRTZ        MOVEQ.L    #0,D0
  1502. MYRTS        RTS
  1503.  
  1504. **************************************************************************
  1505. *   MISC EXEC FUCTIONS                                                   *
  1506. **************************************************************************
  1507.  
  1508. _CacheClearU
  1509.         movem.l    A0,-(A7)
  1510.         move.l    (_RESLOAD),a0
  1511.         jsr    (resload_FlushCache,a0)
  1512.         movem.l    (A7)+,A0
  1513.         rts
  1514.  
  1515. _FindResident:
  1516.     moveq.l    #0,D0
  1517.     rts
  1518.  
  1519. _SetFunction                ; added by JOTD (Banshee)
  1520.         movem.l    D1,-(A7)
  1521.         move.l    2(A1,A0.W),D1
  1522.         move.l    D0,2(A1,A0.W)    ; changed
  1523.         move.l    D1,D0        ; old function
  1524.         movem.l    (A7)+,D1
  1525.         rts
  1526.  
  1527. _Supervisor    move.l    $bc,.s1
  1528.         move.l    #.c1,$bc
  1529.         trap    #15
  1530.         rts
  1531. .c1        move.l    .s1,$bc
  1532.         jmp    (a5)
  1533. .s1        dc.l    0
  1534.  
  1535. _SuperState    MOVE.L    A5,A0
  1536.         LEA       .ac,A5
  1537.         JMP       _LVOSupervisor(A6)
  1538. .ac        MOVE.L    A0,A5
  1539.         MOVEQ     #$00,D0
  1540.         BSET      #$05,(A7)
  1541.         BNE.S     .ca
  1542.         MOVE.W    (A7)+,SR
  1543.         MOVE.L    A7,D0
  1544.         MOVE.L    USP,A7
  1545.         BTST      #$00,$0129(A6)
  1546.         BEQ.S     .c6
  1547.         ADDQ.L    #$2,D0
  1548. .c6        ADDQ.L    #$4,D0
  1549.         RTS
  1550. .ca        RTE
  1551.  
  1552. _UserState    MOVE.L    (A7)+,A0
  1553.         MOVE.L    A7,USP
  1554.         MOVE.L    D0,A7
  1555.         ANDI.W    #$dfff,SR
  1556.         JMP       (A0)
  1557.  
  1558.  
  1559. _CreateIORequest
  1560.     movem.l    D2/D3,-(SP)
  1561.     move.l    D0,D2
  1562.     move.l    A0,D3
  1563.     beq.s    .error
  1564.     move.l    #$10001,D1
  1565.     jsr    _LVOAllocMem(A6)
  1566.     movea.l    D0,A0
  1567.     tst.l    D0
  1568.     beq.s    .error
  1569.     move.b    #NT_REPLYMSG,LN_TYPE(A0)
  1570.     move.l    D3,MN_REPLYPORT(A0)
  1571.     move.w    D2,MN_LENGTH(A0)
  1572. .error
  1573.     move.l    A0,D0
  1574.     movem.l    (SP)+,D2/D3
  1575.     rts
  1576.  
  1577. _DeleteIORequest
  1578.     move.l    A0,D0
  1579.     beq.s    .abort
  1580.     moveq    #-1,D0
  1581.     move.l    D0,LN_SUCC(A0)
  1582.     move.l    D0,IO_DEVICE(A0)
  1583.     moveq    #0,D0
  1584.     move.w    MN_LENGTH(A0),D0
  1585.     movea.l    A0,A1
  1586.     jsr    _LVOFreeMem(A6)
  1587. .abort
  1588.     rts
  1589.  
  1590. _CreateMsgPort
  1591.     moveq    #MP_SIZE,D0    ;$22,D0
  1592.     move.l    #$10001,D1
  1593.     jsr    _LVOAllocMem(A6)
  1594.     move.l    D0,-(SP)
  1595.     beq.s    .error
  1596.     moveq    #-1,D0
  1597.     jsr    _LVOAllocSignal(A6)
  1598.     movea.l    (SP),A0
  1599.     move.b    #NT_MSGPORT,LN_TYPE(A0)
  1600.     move.b    #PA_SIGNAL,MP_FLAGS(A0)
  1601.     move.b    D0,MP_SIGBIT(A0)
  1602.     bmi.s    .abort
  1603.     move.l    ThisTask(A6),MP_SIGTASK(A0)
  1604.     lea    MP_MSGLIST(A0),A1
  1605.     move.l    A1,8(A1)
  1606.     addq.l    #4,A1
  1607.     clr.l    (A1)
  1608.     move.l    A1,-(A1)
  1609. .error
  1610.     move.l    (SP)+,D0
  1611.     rts
  1612.  
  1613. .abort
  1614.     moveq    #MP_SIZE,D0
  1615.     movea.l    A0,A1
  1616.     jsr    _LVOFreeMem(A6)
  1617.     clr.l    (SP)
  1618.     bra.s    .error
  1619.  
  1620. _DeleteMsgPort
  1621.     move.l    A0,-(SP)
  1622.     beq.s    .abort
  1623.     moveq    #0,D0
  1624.     move.b    MP_SIGBIT(A0),D0
  1625.     jsr    _LVOFreeSignal(A6)
  1626.     movea.l    (SP),A1
  1627.     moveq    #-1,D0
  1628.     move.l    D0,MP_MSGLIST(A1)
  1629.     move.l    D0,LN_SUCC(A1)
  1630.     moveq    #MP_SIZE,D0
  1631.     jsr    _LVOFreeMem(A6)
  1632. .abort
  1633.     addq.l    #4,SP
  1634.     rts
  1635.  
  1636.  
  1637. **************************************************************************
  1638. *   Task related functions                                               *
  1639. **************************************************************************
  1640.  
  1641. _AllocSignal
  1642.     movea.l    ThisTask(A6),A1
  1643.     move.l    TC_SIGALLOC(A1),D1
  1644.     cmp.b    #-1,D0
  1645.     beq.s    .search
  1646.     bset    D0,D1
  1647.     beq.s    .free
  1648.     bra.s    .err
  1649.  
  1650. .search
  1651.     moveq.l    #$20-1,D0
  1652. .search2
  1653.     bset    D0,D1
  1654.     beq.s    .free
  1655.     dbra    D0,.search2
  1656. .err
  1657.     moveq.l    #-1,D0
  1658.     rts
  1659.  
  1660. .free
  1661.     move.l    D1,TC_SIGALLOC(A1)
  1662.     moveq    #-1,D1
  1663.     bclr    D0,D1
  1664.     and.l    D1,TC_SIGRECVD(A1)
  1665.     and.l    D1,TC_SIGEXCEPT(A1)
  1666.     and.l    D1,TC_SIGWAIT(A1)
  1667.     rts
  1668.  
  1669. _FreeSignal
  1670.         cmp.b    #$FF,D0
  1671.         beq.s    .skip            ; Mr Larmer: no more error
  1672.         movea.l    ThisTask(A6),A1
  1673.         move.l    TC_SIGALLOC(A1),D1
  1674.         bclr    D0,D1
  1675.         move.l    D1,TC_SIGALLOC(A1)
  1676. .skip
  1677.         rts
  1678.  
  1679.  
  1680. _SetSignal    MOVE.L    ThisTask(A6),A0
  1681.         MOVE.L    TC_SIGRECVD(A0),-(A7)
  1682.         AND.L    D1,D0
  1683.         NOT.L    D1
  1684.         AND.L    TC_SIGRECVD(A0),D1
  1685.         OR.L    D0,D1
  1686.         MOVE.L    D1,TC_SIGRECVD(A0)
  1687.         MOVE.L    (A7)+,d0
  1688.         rts
  1689.  
  1690. _Disable
  1691.         move.w    #INTF_INTEN,(_custom+intena)
  1692.         rts
  1693. _Enable
  1694.         move.w    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  1695.         rts
  1696.  
  1697. _FINDTASK    MOVE.L    A1,-(A7)    ;fails if not own task searched
  1698.         TST.L    (A7)+
  1699.         BNE.S    .FAIL
  1700.         MOVE.L    4.W,A0
  1701.         MOVE.L    ThisTask(A0),D0
  1702.         RTS
  1703.  
  1704. .FAIL
  1705. ;        MOVEQ.L    #0,d0
  1706. ;        rts
  1707.         pea    _LVOFindTask
  1708.         pea    _execname
  1709.         bra    _emufail
  1710.  
  1711. **************************************************************************
  1712. *   MEMORYFUNCTIONS                                                      *
  1713. **************************************************************************
  1714.  
  1715. ; AllocEntry(): Added by JOTD by request of Bored Seal
  1716. ; Tested on DragonNinja
  1717.  
  1718. ; < A0: memList
  1719. ; > D0: allocated memList
  1720.  
  1721. ALLOCENTRY:
  1722.     movem.l    D1-A6,-(A7)
  1723.     move.l    A0,A5
  1724.     moveq.l    #0,D0
  1725.     move.w    LN_SIZE(A5),D0
  1726.     lsl.l    #3,D0
  1727.     add.l    #$10,D0
  1728.     move.l    D0,D5        ; size
  1729.     move.l    #MEMF_PUBLIC,D1
  1730.     jsr    (_LVOAllocMem,a6)
  1731.     move.l    D0,D6
  1732.     beq.b    .fail
  1733.  
  1734.     ; allocated OK
  1735.  
  1736.     move.l    D6,A4
  1737.  
  1738.     moveq.l    #0,D0
  1739.     move.l    A5,A0
  1740.     move.l    A4,A1
  1741.     move.l    D5,D0
  1742.     jsr    (_LVOCopyMem,a6)
  1743.  
  1744.     moveq.l    #0,D2
  1745.     move.w    LN_SIZE(A4),D2    ; # of items
  1746.     
  1747.     add.l    #LN_SIZE+2,A4
  1748. .loop
  1749.     move.l    (A4)+,D1    ; flags
  1750.     move.l    (A4)+,D0    ; size
  1751.     jsr    (_LVOAllocMem,a6)
  1752.     beq.b    .fail        ; alloc problem
  1753.     move.l    D0,-8(A4)    ; store memblock start in flags (union)
  1754.     subq.l    #1,D2
  1755.     bne.b    .loop
  1756.  
  1757.     move.l    D6,D0        ; new memlist
  1758. .exit
  1759.     movem.l    (A7)+,D1-A6
  1760.     rts
  1761.  
  1762. .fail:
  1763.     moveq.l    #0,D0
  1764.     bset    #31,D0
  1765.     bra.b    .exit
  1766.  
  1767. ; FreeEntry(): still untested but should work
  1768.  
  1769. FREEENTRY:
  1770.  
  1771.     movem.l    D1-A6,-(A7)
  1772.     move.l    A0,A4
  1773.  
  1774.     move.w    LN_SIZE(A4),D2    ; # of items
  1775.     
  1776.     add.l    #LN_SIZE+2,A4
  1777. .loop
  1778.     move.l    (A4)+,A1    ; memory pointer
  1779.     move.l    (A4)+,D0    ; memory size
  1780.     jsr    (_LVOFreeMem,a6)
  1781.     subq.l    #1,D2
  1782.     bne.b    .loop
  1783.  
  1784. .exit
  1785.     movem.l    (A7)+,D1-A6
  1786.     rts
  1787.  
  1788. _COPYMEM
  1789.     CMP.L    A0,A1
  1790.     BLS.S    .ASCEND
  1791. .DESCEND
  1792.     LEA.L    (A0,D0.L),A0
  1793.     LEA.L    (A1,D0.L),A1
  1794. .LD    MOVE.B    -(A0),-(A1)
  1795.     SUBQ.L    #1,D0
  1796.     BNE.S    .LD
  1797.     RTS
  1798.  
  1799. .ASCEND
  1800. .LA    MOVE.B    (A0)+,(A1)+
  1801.     SUBQ.L    #1,D0
  1802.     BNE.S    .LA
  1803.     RTS
  1804.  
  1805. FREEM
  1806.     TST.L    D0
  1807.     BNE.S    .NOZERO
  1808.     RTS
  1809.  
  1810. .NOZERO
  1811.     cmp.l    #$1000000,D0    ; JOTD: safety, I had to switch off my amy
  1812.     bcc.b    .FREEMFAIL    ; when the value passed was too high (here >16MB)!    
  1813.  
  1814.     CMP.L    #ALLOCMTAB,A1        ; above ALLOCMTAB
  1815.     BHS.S    .OK            ; okay, try to free
  1816. .FREEMFAIL
  1817.     pea    _LVOFreeMem
  1818.     pea    _execname
  1819.     bra    _emufail
  1820.  
  1821. .OK
  1822.     tst.l    OSM_EXPMEM
  1823.     beq.b    .FreeChip
  1824.  
  1825.     cmp.l    OSM_EXPMEM,A1
  1826.     bcs.b    .FreeChip    ; below expansion memory -> chipmem
  1827.  
  1828.     ; fast memory - added by JOTD
  1829.  
  1830. .FreeFast:
  1831.     move.l    OSM_EXPMEM,A0        ; start of memory expansion
  1832.     add.l    OSM_EXPSIZE,A0        ; size of memory expansion
  1833.  
  1834.     cmp.l    A0,A1
  1835.     bcc.b    .FREEMFAIL        ; trying to free above memory expansion
  1836.  
  1837.     move.l    OSM_EXPMEM,A0        ; start of memory table (fastmem)
  1838.     sub.l    A0,A1            ; corrects offset on address !!
  1839.     bra.b    .FreeGeneric        ; removed by Harry
  1840.  
  1841.     ; chip memory - Harry's original
  1842.  
  1843. .FreeChip:
  1844.     LEA.L    ALLOCMTAB,A0        ; start of memory table (chipmem)
  1845.  
  1846. .FreeGeneric:
  1847.     MOVEM.L    D2/D3/A2/A3,-(A7)
  1848.     MOVE.L    A1,D1
  1849.     ADDQ.L    #7,D0
  1850.     AND.L    #$FFFFFFF8,D1
  1851.     AND.L    #$FFFFFFF8,D0
  1852.     BEQ.S    .QU
  1853.     LSR.L    #3,D0            ;# OF BITS TO CLEAR IN D0
  1854.  
  1855.                     ;FREE MEM NOT ON A $40-BOUNDARY
  1856.                     ;EVAL BEGINBYTE
  1857.     MOVE.L    D1,D2
  1858.     LSR.L    #6,D2
  1859.     LEA.L    (A0,D2.L),A0
  1860.     MOVEM.L    D1,-(A7)
  1861.     AND.L    #$3F,D1
  1862.     BEQ.S    .CNTCLR
  1863.     LSR.L    #3,D1
  1864. .2    BSET    D1,(A0)
  1865.     ADDQ.L    #1,D1
  1866.     ADDQ.L    #8,(A7)
  1867.     SUBQ.L    #1,D0
  1868.     BEQ.S    .1
  1869.     CMP.L    #8,D1
  1870.     BEQ.S    .CNTCLR2
  1871.     BRA.S    .2
  1872.  
  1873. .1    MOVEM.L    (A7)+,D1
  1874.     BRA.S    .QU
  1875.  
  1876. .CNTCLR2
  1877.     ADDQ.L    #1,A0
  1878. .CNTCLR
  1879.     MOVEM.L    (A7)+,D1
  1880.  
  1881.                     ;CLEAR $40-BOUNDARY-BYTES
  1882. .3    CMP.L    #8,D0
  1883.     BLO.S    .CLREND
  1884.  
  1885.     ST    (A0)+
  1886.     SUBQ.L    #8,D0
  1887.     BRA.S    .3
  1888.  
  1889.  
  1890. .CLREND                    ;CLEAR END NOT ENDING ON A $40-
  1891.     TST.L    D0            ;BOUNDARY
  1892.     BEQ.S    .QU
  1893.     SUBQ.L    #1,D0
  1894.     BSET    D0,(A0)
  1895.     BRA.S    .CLREND
  1896.  
  1897. .QU    MOVEM.L    (A7)+,D2/D3/A2/A3
  1898.     RTS
  1899.  
  1900.  
  1901. ; < A1: memory pointer
  1902. ; > D0: flags
  1903.  
  1904. TYPEOFMEM:
  1905.     move.l    A0,-(A7)
  1906.     moveq.l    #0,D0
  1907.     cmp.l    MaxLocMem(A6),A1
  1908.     bcs.b    .chipmem
  1909.  
  1910.     move.l    OSM_EXPMEM,A0
  1911.     cmp.l    A0,A1
  1912.     bcs.b    .exit        ; not in chip and below expansion: unknown
  1913.  
  1914.     add.l    OSM_EXPSIZE,A0
  1915.     cmp.l    A0,A1
  1916.     bcc.b    .exit        ; not in chip and above expansion: unknown
  1917.  
  1918.     move.l    #MEMF_FAST,D0
  1919.     bra.b    .exit
  1920.  
  1921. .chipmem
  1922.     cmp.l    #$1000,A1
  1923.     bcs.b    .exit
  1924.     move.l    #MEMF_CHIP,D0
  1925. .exit
  1926.     move.l    (A7)+,A0
  1927.     rts
  1928.  
  1929. ;>D0:SIZE
  1930. ;>D1:CONDITIONS
  1931. ;<D0:ADDY
  1932. ;LIMITATIONS:
  1933. ;        -MEM ALWAYS CLEARED (MEMF_CLEAR ASSUMED)
  1934. ;        -MEMORY IS $40-ALIGNED (SOME BYTES WASTED)
  1935. ;        -MEMF_LARGEST IS IGNORED AS IN THE OS
  1936. ;        -ATM, ALSO MEMF_REVERSE IS IGNORED
  1937.  
  1938. ALLOCM:
  1939.     tst.l    d0
  1940.     beq    .NOFAST    ; not fatal anymore, allows broken programs to work
  1941.  
  1942.     MOVE.L    D1,-(A7)
  1943.     and.l    #~(MEMF_REVERSE!MEMF_LARGEST!MEMF_FAST!MEMF_CHIP!MEMF_CLEAR!MEMF_PUBLIC),(A7)+
  1944.     bne    .fail        ; wrong flags
  1945.     btst    #MEMB_CHIP,d1    ; chipmem required?
  1946.     BEQ.S    .FMEM        ; JOTD: MEMB_CHIP not specified -> alloc fast
  1947.     
  1948. .NORMALCHIP
  1949.     MOVEM.L    D2-D5/A2/A3/A4,-(A7)
  1950.  
  1951.     addq.l    #7,d0
  1952.     LSR.L    #3,D0
  1953.     ;SEARCH SUFFICIENT BIG MEMAREA
  1954.  
  1955.     LEA.L    ALLOCMTAB,A0    ;FIND A BYTE != 0 (FREE MEM)
  1956.     move.l    ALLOCMTABSIZE,A3
  1957.     sub.l    A4,A4
  1958.  
  1959.     bsr    AllocGeneric
  1960.  
  1961.     MOVEM.L    (A7)+,D2-D5/A2/A3/A4
  1962.     RTS
  1963.  
  1964. .FMEM:
  1965.     tst.l    OSM_EXPMEM
  1966.     bne.b    .ALLOCFAST        ; expansion available: allocate
  1967.  
  1968.     ; no expansion: check if fast is required
  1969.  
  1970.     btst    #MEMB_FAST,d1
  1971.     bne.b    .NOFAST            ; fastmem not available: error
  1972.  
  1973.     bra.b    .NORMALCHIP        ; no fast memory configured: try chipmem
  1974.  
  1975. .ALLOCFAST
  1976.     MOVEM.L    D2-D5/A2/A3/A4,-(A7)
  1977.     addq.l    #7,d0
  1978.     LSR.L    #3,D0
  1979.     ;SEARCH SUFFICIENT BIG MEMAREA
  1980.  
  1981.     move.l    OSM_EXPMEM,A0    ;FIND A BYTE != 0 (FREE MEM)
  1982.     move.l    ALLOCFASTMTABSIZE,A3
  1983.     move.l    A0,A4        ; offset to add for ALLOCA
  1984.  
  1985.     bsr    AllocGeneric
  1986.  
  1987.     MOVEM.L    (A7)+,D2-D5/A2/A3/A4
  1988.     RTS
  1989.  
  1990. .NOFAST
  1991.     moveq.l    #0,D0
  1992.     rts
  1993.  
  1994. .fail    
  1995.     EXECFAIL _LVOAllocMem
  1996.  
  1997. ; Added by JOTD to be used with chip and fast alloc
  1998. ; < A0: alloc table
  1999. ; < A3: end of alloc table
  2000. ; < A4: offset to add to calculated address (0 for chip, OSM_EXPMEM for fast)
  2001.  
  2002. AllocGeneric:
  2003.     MOVEQ.L    #0,D4
  2004. .2
  2005.     CMP.B    #$FF,(A0)+
  2006.     BEQ.S    .1
  2007.     ADD.L    #$40,D4
  2008.     CMP.L    A3,A0
  2009.     BNE.S    .2
  2010.     BRA.S    .ERR
  2011.                     ;found free mem
  2012.                     ;CHECK NOW SIZE 
  2013. .1    SUBQ.L    #1,A0
  2014.                     ;D4-BASE
  2015. .3
  2016.     MOVE.L    D0,-(A7)        ;WANTED SIZE
  2017.     MOVE.L    D4,-(A7)        ;FOUND ADDRESS
  2018.  
  2019. .6    TST.L    D0
  2020.     BMI.S    .CHKEND
  2021.     CMP.B    #$FF,(A0)
  2022.     BNE.S    .TOOSMALL
  2023.     ADDQ.L    #1,A0        ;CHECK FOR EXCEEDING THE SIZE OF ALLOCMTAB
  2024.                 ;MAY BE OMITTED SINCE ITS END CONTAINS $0
  2025.     ADD.L    #$40,D4
  2026.     SUBQ.L    #8,D0
  2027.     BEQ.S    .CHKEND
  2028.     BRA.S    .6
  2029.  
  2030. .TOOSMALL                ;LATER TODO: FIND EVENTUAL ZEROBITS
  2031.  
  2032.     ADDQ.L    #4,A7            ;DISCARD D4 ON STACK
  2033.     MOVE.L    (A7)+,D0
  2034.     ADDQ.L    #1,A0
  2035. ;    AND.L    #$FFFFFFC0,D4
  2036.     ADD.L    #$40,D4
  2037.     BRA.S    .2
  2038.  
  2039. .CHKEND
  2040.     MOVE.L    (A7)+,D4
  2041.     MOVE.L    (A7)+,D0
  2042.     LSL.L    #3,D0
  2043. ;D0-SIZE
  2044. ;D4-ABS
  2045.     ;MARK AREA AS USED
  2046.     MOVE.L    D4,A1
  2047.     MOVE.L    D0,D2
  2048.  
  2049.     add.l    A4,A1            ; added by JOTD, offset for fastmem
  2050.     BSR.W    ALLOCA
  2051.                     ;MEMORYSPACE ALREADY SUCESSFULLY
  2052.                     ;CHECKED, RETURNCODE MAY BE IGNORED
  2053.  
  2054.     MOVE.L    A1,A2
  2055. ;    MOVE.L    D4,D2
  2056.     LSR.L    #2,D2
  2057.     BRA.S    .CLRM
  2058.  
  2059. .CLRM1    CLR.L    (A2)+
  2060. .CLRM    DBF    D2,.CLRM1
  2061. .exit
  2062.     tst.l    d0            ;some progs expect an correct set zero flag
  2063.     rts
  2064. .ERR:
  2065.     moveq.l    #0,D0            ; unable to allocate: table full
  2066.     rts
  2067.  
  2068. ;RETURNS AT THE MOMENT ONLY THE SIZE OF THE LARGEST CHUNK-$1000 SAFETY
  2069. AVAILM
  2070.     MOVEM.L    A2/A3/D2/D3,-(A7)
  2071.     MOVE.L    D1,D2
  2072.     AND.L    #MEMF_FAST,D2
  2073.     BNE.S    .FMEM
  2074.  
  2075.     ; check for chipmem available
  2076.  
  2077.     LEA.L    ALLOCMTAB,A0
  2078.     move.l    ALLOCMTABSIZE(pc),A3
  2079.  
  2080.     bsr    GenericAvail
  2081.  
  2082.  
  2083. .exit
  2084.     MOVEM.L    (A7)+,A2/A3/D2/D3
  2085.     RTS
  2086.  
  2087. .FMEM    
  2088.     move.l    OSM_EXPMEM,A0
  2089.     cmp.l    #0,A0
  2090.     beq.b    .nomem
  2091.     move.l    ALLOCFASTMTABSIZE(pc),A3
  2092.  
  2093.     bsr    GenericAvail
  2094.     bra.b    .exit
  2095.  
  2096. .nomem:
  2097.     moveq.l    #0,D0
  2098.     bra.b    .exit
  2099.     
  2100. ; for chip & fast memory
  2101.  
  2102. GenericAvail:
  2103.     MOVEQ.L    #0,D2
  2104.     MOVEQ.L    #0,D3
  2105. .3    MOVE.B    (A0)+,D0
  2106.     CMP.B    #$FF,D0            ;SEARCH CHUNK
  2107.     BNE.S    .1
  2108.     ADD.L    #$40,D3
  2109.     BRA.S    .2
  2110.  
  2111. .1    CMP.L    D2,D3            ;END OF CHUNK, COMPARE SIZE WITH
  2112.     BLO.S    .4            ;PREVIOUS SIZE
  2113.     MOVE.L    D3,D2            ;ACTUAL IS LARGER -> NEW LARGEST SIZE
  2114. .4    MOVEQ.L    #0,D3            ;RESET SIZE OF NEXT CHUNK
  2115. .2    CMP.L    A3,A0            ;UNTIL MEMORYTABLE EXCEEDED
  2116.     BLO.S    .3
  2117.     cmp.l    d2,d3
  2118.     blo    .5
  2119.     move.l    d3,d2
  2120. .5
  2121.     CMP.L    #$2000,D2
  2122.     BLO.S    .6
  2123.     SUB.L    #$1000,D2
  2124. .6    MOVE.L    D2,D0
  2125.     rts
  2126.  
  2127. ALLOCA:
  2128.     tst.l    OSM_EXPMEM
  2129.     beq.b    .ALLOCA_CHIP    ; no expansion: alloc chipmem
  2130.     cmp.l    OSM_EXPMEM,A1
  2131.     bcc.b    .ALLOCA_FAST    ; above expansion: fast memory
  2132. .ALLOCA_CHIP:
  2133.     movem.l    A4,-(A7)
  2134.     LEA.L    ALLOCMTAB,A4    ; chipmem alloc table
  2135.     bsr    GenericAllocAbs
  2136.     movem.l    (A7)+,A4
  2137.     move.l    D0,A1
  2138.     rts
  2139.  
  2140. .ALLOCA_FAST:
  2141.     movem.l    A4,-(A7)
  2142.     move.l    OSM_EXPMEM,A4        ; fastmem alloc table
  2143.     sub.l    A4,A1            ; substracts expbase from the address
  2144.     bsr    GenericAllocAbs        ; the routine returns only offset
  2145.     add.l    A4,D0            ; relative to memory block so we have to add expbase
  2146.     move.l    D0,A1            ; A1=D0 for Harry!
  2147.     movem.l    (A7)+,A4
  2148.     rts
  2149.  
  2150. ; < A4: allocmtab (added by JOTD to be used by fastmem and chipmem)
  2151.  
  2152.  
  2153. GenericAllocAbs
  2154.     MOVEM.L    D2/D3/A2/A3,-(A7)
  2155.     MOVE.L    A7,A3
  2156.     MOVE.L    _Slave(PC),A2
  2157.     MOVE.L    A1,D2
  2158.     ADD.L    D0,D2
  2159.     CMP.L    A2,D2
  2160.     BHS.W    .ERR
  2161.  
  2162.     move.l    A1,D1
  2163.  
  2164. ;    ADDQ.L    #7,D1
  2165.     AND.L    #$FFFFFFF8,D1
  2166.     AND.L    #$FFFFFFF8,D0
  2167.     BEQ.W    .QU
  2168.     MOVEM.L    D0/D1,-(A7)
  2169.  
  2170.     LSR.L    #3,D0            ;# OF BITS TO CLEAR IN D0
  2171.  
  2172.                     ;CHECK MEM NOT ON A $40-BOUNDARY
  2173.                     ;EVAL BEGINBYTE
  2174.     MOVE.L    D1,D2
  2175.     LSR.L    #6,D2
  2176.     move.L    A4,A0
  2177.     LEA.L    (A0,D2.L),A0
  2178.     MOVEM.L    D1,-(A7)
  2179.     AND.L    #$3F,D1
  2180.     BEQ.S    .CNTCHK
  2181.     LSR.L    #3,D1
  2182. .2    BTST    D1,(A0)
  2183.     BEQ.W    .ERR
  2184.     ADDQ.L    #1,D1
  2185. ;    ADDQ.L    #8,(A7)
  2186.     SUBQ.L    #1,D0
  2187.     BEQ.S    .1
  2188.     CMP.L    #8,D1
  2189.     BEQ.S    .CNTCHK2
  2190.     BRA.S    .2
  2191.  
  2192. .1    MOVEM.L    (A7)+,D1
  2193.     BRA.S    .CONT
  2194.  
  2195. .CNTCHK2
  2196.     ADDQ.L    #1,A0
  2197. .CNTCHK
  2198.     MOVEM.L    (A7)+,D1
  2199.  
  2200.                     ;CLEAR $40-BOUNDARY-BYTES
  2201. .3    CMP.L    #8,D0
  2202.     BLO.S    .CLREND
  2203.  
  2204.     CMP.B    #$FF,(A0)+
  2205.     BNE.S    .ERR
  2206.     SUBQ.L    #8,D0
  2207.     BRA.S    .3
  2208.  
  2209.  
  2210. .CLREND
  2211.     TST.L    D0
  2212.     BEQ.S    .CONT
  2213.     SUBQ.L    #1,D0
  2214.     BTST    D0,(A0)
  2215.     BEQ.S    .ERR
  2216.     BRA.S    .CLREND
  2217.  
  2218. .CONT    MOVEM.L    (A7)+,D0/D1
  2219.  
  2220.                     ;ALLOC MEM
  2221.  
  2222.     LSR.L    #3,D0            ;# OF BITS TO CLEAR IN D0
  2223.  
  2224.                     ;MARK MEM NOT ON A $40-BOUNDARY
  2225.                     ;EVAL BEGINBYTE
  2226.     MOVE.L    D1,D2
  2227.     LSR.L    #6,D2
  2228.     move.l    A4,A0
  2229.     LEA.L    (A0,D2.L),A0
  2230.     MOVEM.L    D1,-(A7)
  2231.     AND.L    #$3F,D1
  2232.     BEQ.S    .CNTMARK
  2233.     LSR.L    #3,D1
  2234. .22    BCLR    D1,(A0)
  2235.     ADDQ.L    #1,D1
  2236. ;    ADDQ.L    #8,(A7)
  2237.     SUBQ.L    #1,D0
  2238.     BEQ.S    .21
  2239.     CMP.L    #8,D1
  2240.     BEQ.S    .CNTMARK2
  2241.     BRA.S    .22
  2242.  
  2243. .21    MOVEM.L    (A7)+,D1
  2244.     BRA.S    .QU
  2245.  
  2246. .CNTMARK2
  2247.     ADDQ.L    #1,A0
  2248. .CNTMARK
  2249.     MOVEM.L    (A7)+,D1
  2250.  
  2251.                     ;CLEAR $40-BOUNDARY-BYTES
  2252. .23    CMP.L    #8,D0
  2253.     BLO.S    .MARKEND
  2254.  
  2255.     SF    (A0)+
  2256.     SUBQ.L    #8,D0
  2257.     BRA.S    .23
  2258.  
  2259.  
  2260. .MARKEND
  2261.     TST.L    D0
  2262.     BEQ.S    .QU
  2263.     SUBQ.L    #1,D0
  2264.     BCLR    D0,(A0)
  2265.     BRA.S    .MARKEND
  2266.  
  2267. .QU
  2268.  
  2269.     MOVE.L    A3,A7
  2270.     MOVEM.L    (A7)+,D2/D3/A2/A3
  2271.     MOVE.L    D1,D0
  2272.     RTS
  2273. .ERR2
  2274. .ERR    MOVE.L    A3,A7
  2275.     MOVEM.L    (A7)+,D2/D3/A2/A3
  2276.     MOVEQ.L    #0,D0
  2277.     RTS
  2278.  
  2279.  
  2280. ****************************************************************************
  2281. * LIST HANDLING IN EXEC                                                    *
  2282. ****************************************************************************
  2283.  
  2284.     ifeq 1
  2285.  
  2286. _Enqueue    ;a0=list a1=node
  2287.     MOVE.B    (LN_PRI,A1),D1
  2288.     MOVE.L    (LN_SUCC,A0),D0
  2289. .1908    MOVE.L    D0,A0
  2290.     MOVE.L    (LN_SUCC,A0),D0
  2291.     BEQ.S     .1914
  2292.     CMP.B     (LN_PRI,A0),D1
  2293.     BLE.S     .1908
  2294. .1914    MOVE.L    (LN_PRED,A0),D0
  2295.     MOVE.L    A1,(LN_PRED,A0)
  2296.     MOVE.L    A0,(LN_SUCC,A1)
  2297.     MOVE.L    D0,(LN_PRED,A1)
  2298.     MOVE.L    D0,A0
  2299.     MOVE.L    A1,(LN_SUCC,A0)
  2300.     RTS
  2301.  
  2302.     endc
  2303.  
  2304. _FINDNAME    ;a0-list, a1-name, returns d0-node
  2305.     MOVEM.L    A2,-(A7)
  2306.     MOVE.L    A0,A2        ;find listheader (lords of war *grr*)
  2307. .HSEARCH
  2308.     TST.L    4(A2)
  2309.     BEQ.S    .HFOUND
  2310.     MOVE.L    4(A2),A2
  2311.     BRA.S    .HSEARCH
  2312.  
  2313. .HFOUND
  2314. .LOOP    TST.L    (A2)
  2315.     BEQ.S    .NOTFOUND
  2316.     MOVE.L    (A2),A2
  2317.     MOVE.L    LN_NAME(A2),A0
  2318.     BSR.W    _strcmp
  2319.     TST.L    D0
  2320.     BEQ.S    .FOUND
  2321.     BRA.S    .LOOP
  2322.  
  2323. .FOUND    MOVE.L    A2,D0
  2324.     MOVEM.L    (A7)+,A2
  2325.     RTS
  2326.  
  2327. .NOTFOUND
  2328.     MOVEQ.L    #0,D0
  2329.     MOVEM.L    (A7)+,A2
  2330.     RTS
  2331.  
  2332.  
  2333. _INSERT        ;a0-list a1-node to be inserted a2-node after which to insert
  2334. .HSEARCH
  2335.     TST.L    4(A0)
  2336.     BEQ.S    .HFOUND
  2337.     MOVE.L    4(A0),A0
  2338.     BRA.S    .HSEARCH
  2339.  
  2340. .HFOUND
  2341.     MOVE.L    A2,-(A7)
  2342.     TST.L    (A7)+
  2343.     BEQ.S    .ADDHEAD
  2344.     CMP.L    A0,A2
  2345.     BEQ.S    .ADDHEAD
  2346.     MOVE.L    LH_TAILPRED(A0),-(A7)
  2347.     CMPM.L    (A7)+,(A2)+    ;IF INSERTING AT END -> .ADDTAIL
  2348.     LEA.L    -4(A2),A2
  2349.     BEQ.S    .ADDTAIL
  2350.     MOVE.L    (A2),A0        ;SUCCESSOR
  2351.     MOVE.L    A1,(LN_PRED,A0)    ;NEW PREDECESSOR
  2352.     MOVE.L    (A2),(A1)    ;SUCCESSOR IN ELEMENT TO BE INSERTED
  2353.     MOVE.L    A2,(LN_PRED,A1)    ;PREDECESSOR IN ELEMENT TO BE INSERTED
  2354.     MOVE.L    A1,(A2)        ;INSERTED NODE IS SUCCESSOR
  2355.     RTS
  2356.  
  2357. .ADDTAIL
  2358.     MOVE.L    (A2),(A1)
  2359.     MOVE.L    A2,LN_PRED(A1)
  2360.     MOVE.L    A1,LH_TAILPRED(A0)
  2361.     MOVE.L    A1,(A2)
  2362.     RTS
  2363.  
  2364. .ADDHEAD
  2365. _ADDHEAD
  2366.     MOVE.L    A2,-(A7)
  2367.     MOVE.L    (A0),A2
  2368.     TST.L    (A2)
  2369.     BEQ.S    .EMPTYLIST
  2370.  
  2371.     MOVE.L    (A0),A2
  2372.     MOVE.L    A2,(A1)
  2373.     MOVE.L    LN_PRED(A2),LN_PRED(A1)
  2374.     MOVE.L    A1,LN_PRED(A2)
  2375.     MOVE.L    A1,(A0)
  2376.     BRA.S    .END
  2377.  
  2378. .EMPTYLIST
  2379.     MOVE.L    (A0),(A1)
  2380.     MOVE.L    LH_TAILPRED(A0),LN_PRED(A1)
  2381.     MOVE.L    A1,(A0)            ;INSERT ELEMENT AS FIRST INTO *LIST
  2382.     MOVE.L    A1,LH_TAILPRED(A0)    ;ELEMENT IS ALSO LAST ONE
  2383. .END    MOVE.L    (A7)+,A2
  2384.     RTS
  2385.  
  2386. _ADDTAIL
  2387.     MOVE.L    A2,-(A7)
  2388.     MOVE.L    (A0),A2
  2389.     TST.L    (A2)
  2390.     BEQ.S    .EMPTYLIST
  2391.     MOVE.L    LH_TAILPRED(A0),A2
  2392.  
  2393.     MOVE.L    (A2),(A1)
  2394.     MOVE.L    A2,LN_PRED(A1)
  2395.     MOVE.L    A1,LH_TAILPRED(A0)
  2396.     MOVE.L    A1,(A2)
  2397.     BRA.S    .END
  2398.  
  2399. .EMPTYLIST
  2400.     MOVE.L    (A0),(A1)
  2401.     MOVE.L    LH_TAILPRED(A0),LN_PRED(A1)
  2402.     MOVE.L    A1,(A0)            ;INSERT ELEMENT AS FIRST INTO *LIST
  2403.     MOVE.L    A1,LH_TAILPRED(A0)
  2404. .END    MOVE.L    (A7)+,A2
  2405.     RTS
  2406.  
  2407. _REMOVE        ;A1-NODE TO REMOVE
  2408.     MOVEM.L    A2,-(A7)
  2409.     MOVE.L    A1,A2
  2410. .HSEARCH
  2411.     TST.L    4(A2)
  2412.     BEQ.S    .HFOUND
  2413.     MOVE.L    4(A2),A2
  2414.     BRA.S    .HSEARCH
  2415.  
  2416. .HFOUND
  2417.     MOVE.L    (A1),A0
  2418.     TST.L    (A0)
  2419.     BEQ.S    .REMTAIL
  2420.     CMP.L    (A2),A1
  2421.     BEQ.S    .REMHEAD
  2422.  
  2423.     MOVE.L    LN_PRED(A1),A0
  2424.     MOVE.L    (A1),(A0)
  2425.     MOVE.L    (A1),A0
  2426.     MOVE.L    LN_PRED(A1),LN_PRED(A0)
  2427. .END    MOVEM.L    (A7)+,A2
  2428.     RTS
  2429.  
  2430. .REMHEAD
  2431.     MOVE.L    A2,A0
  2432.     BSR.S    _REMHEAD
  2433.     BRA.S    .END
  2434.  
  2435. .REMTAIL
  2436.     MOVE.L    A2,A0
  2437.     BSR.S    _REMTAIL
  2438.     BRA.S    .END
  2439.  
  2440. _REMHEAD
  2441.     MOVE.L    (A0),A1
  2442.     TST.L    (A1)
  2443.     BEQ.S    .EMPTYLIST
  2444.     MOVE.L    A2,-(A7)
  2445.     MOVE.L    (A0),A2
  2446.     MOVE.L    A2,D0
  2447.     MOVE.L    (A2),-(A7)
  2448.     TST.L    (A7)+
  2449.     BEQ.S    .SINGLEELEMENT
  2450.     MOVE.L    LN_PRED(A2),D1
  2451.     MOVE.L    (A2),A2
  2452.     MOVE.L    D1,LN_PRED(A2)
  2453.     MOVE.L    A2,(A0)
  2454.     MOVE.L    (A7)+,A2
  2455.     RTS
  2456.  
  2457. .SINGLEELEMENT
  2458.     MOVE.L    (A0),A2
  2459.     MOVE.L    (A2),(A0)
  2460.     MOVE.L    LN_PRED(A2),LH_TAILPRED(A0)
  2461.     MOVE.L    (A7)+,A2
  2462.     RTS
  2463.  
  2464. .EMPTYLIST
  2465.     MOVEQ.L    #0,D0
  2466.     RTS
  2467.  
  2468. _REMTAIL
  2469.     MOVE.L    (A0),A1
  2470.     TST.L    (A1)
  2471.     BEQ.S    .EMPTYLIST
  2472.     MOVE.L    A2,-(A7)
  2473.     MOVE.L    LH_TAILPRED(A0),A2
  2474.     MOVE.L    (A2),-(A7)
  2475.     TST.L    (A7)+
  2476.     BEQ.S    .SINGLEELEMENT
  2477.     MOVE.L    A2,D0
  2478.     MOVE.L    (A2),D1
  2479.     MOVE.L    LN_PRED(A2),A2
  2480.     MOVE.L    D1,(A2)
  2481.     MOVE.L    A2,LH_TAILPRED(A0)
  2482.     MOVE.L    (A7)+,A2
  2483.     RTS
  2484.  
  2485. .SINGLEELEMENT
  2486.     MOVE.L    A2,D0
  2487.     MOVE.L    (A2),(A0)
  2488.     MOVE.L    LN_PRED(A2),LH_TAILPRED(A0)
  2489.     MOVE.L    (A7)+,A2
  2490.     RTS
  2491.  
  2492. .EMPTYLIST
  2493.     MOVEQ.L    #0,D0
  2494.     RTS
  2495.  
  2496. ****************************************************************************
  2497. * INTERRUPTPART IN EXEC                                                    *
  2498. ****************************************************************************
  2499.  
  2500. INT_68        movem.l    d0-d1/a0-a1/a5-a6,-(a7)
  2501.         move.w    (_custom+intreqr),d0
  2502.         and.w    #INTF_PORTS,d0
  2503.         beq    .ports_end
  2504.  
  2505.     ;call handler/server
  2506. .ports        PEA    .ports_cont(PC)
  2507.         move.l    (4).W,a1
  2508.         MOVE.L    (IVPORTS+IV_CODE,A1),-(A7)
  2509.         move.l    (IVPORTS+IV_DATA,a1),a1
  2510.         RTS
  2511. .ports_cont
  2512. .ports_end
  2513.         move.w    #INTF_PORTS,(_custom+intreq)
  2514.         movem.l    (a7)+,d0-d1/a0-a1/a5-a6
  2515.         rte
  2516.  
  2517. INTSERVNODE_CIAA
  2518.         dc.l    0        ;LN_SUCC
  2519.         dc.l    0        ;LN_PRED
  2520.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2521.         dc.b    120        ;LN_PRI
  2522.         dc.l    _ciaaname    ;LN_NAME
  2523.         dc.l    0        ;IS_DATA
  2524.         dc.l    INT_CIAA    ;IS_CODE
  2525.  
  2526. ;---------------
  2527.  
  2528. INT_6c        movem.l    d0-d1/a0-a1/a5-a6,-(a7)
  2529.         move.w    (_custom+intreqr),d0
  2530.         and.w    #INTF_COPER!INTF_VERTB,d0
  2531.         AND.W    (_custom+intenar),d0
  2532.         beq    .vertb_end
  2533.         btst    #INTB_COPER,d0
  2534.         bne.s    .vertb_copper
  2535.  
  2536. .vertb
  2537.     ;timer++
  2538.  
  2539.     add.l    #20,millisec_timer
  2540.     cmp.l    #1000,millisec_timer
  2541.     bcs    .skip
  2542.  
  2543.     addq.l    #1,sec_timer
  2544.     clr.l    millisec_timer
  2545. .skip
  2546.     ;set copperlist (this should be the first !)
  2547.         move.l    _gfxbase(PC),a0
  2548.         move.l    (gb_LOFlist,a0),(_custom+cop2lc)
  2549.  ifeq 1
  2550.     ;set sprites
  2551.         tst.b    (gb_SpriteReserved,a0)
  2552.         beq    .ns
  2553.         lea    (_sprites),a0
  2554.         lea    (_custom+sprpt),a1
  2555.         moveq    #7,d0
  2556. .ss        move.l    (a0)+,(a1)+
  2557.         dbf    d0,.ss
  2558. .ns
  2559.  endc
  2560.     ;call handler/server
  2561.         PEA    .vertb_cont(PC)
  2562.         move.l    (4).W,a1
  2563.         MOVE.L    (IVVERTB+IV_CODE,A1),-(A7)
  2564.         move.l    (IVVERTB+IV_DATA,a1),a1
  2565.         RTS
  2566. .vertb_cont
  2567.     ;input handler
  2568.         move.l    _inputhandler(PC),d0
  2569.         beq    .vertb_end
  2570.         moveq    #$6c,d0
  2571.         bsr    _InputHandlerVBI
  2572. .vertb_end
  2573.         move.w    #INTF_BLIT!INTF_VERTB,(_custom+intreq)
  2574.  
  2575. .vertb_vend
  2576.         movem.l    (a7)+,d0-d1/a0-a1/a5-a6
  2577.         rte
  2578. .vertb_copper
  2579.     ;call copperhandler/server
  2580.         PEA    .vertb_cend(PC)
  2581.         move.l    (4).W,a1
  2582.         MOVE.L    (IVCOPER+IV_CODE,A1),-(A7)
  2583.         move.l    (IVCOPER+IV_DATA,a1),a1
  2584.         RTS
  2585.  
  2586. .vertb_cend
  2587.         move.w    #INTF_COPER,(_custom+intreq)
  2588.         bra.s    .vertb_vend
  2589.  
  2590. ;---------------
  2591.  
  2592. INT_70        movem.l    d0-d1/D6/a0-a1/a5-a6,-(a7)
  2593.         move.w    (_custom+intreqr),d6
  2594.         AND.W    (_custom+intenar),d6
  2595.         and.w    #INTF_AUD0!INTF_AUD1!INTF_AUD2!INTF_AUD3,d6
  2596.         BTST    #7,D6
  2597.         BEQ.S    .AUD1
  2598.  
  2599.     ;call handler/server
  2600.         move.l    #$80,d1
  2601.         PEA    .aud0_cont(PC)
  2602.         move.l    (4).W,a1
  2603.         MOVE.L    (IVAUD0+IV_CODE,A1),-(A7)
  2604.         move.l    (IVAUD0+IV_DATA,a1),a1
  2605.         RTS
  2606.  
  2607. .aud0_cont    move.w    #INTF_AUD0,(_custom+intreq)
  2608.         BCLR    #7,D6
  2609.  
  2610. .AUD1        BTST    #8,D6
  2611.         BEQ.S    .AUD2
  2612.  
  2613.     ;call handler/server
  2614.         move.l    #$100,d1
  2615.         PEA    .aud1_cont(PC)
  2616.         move.l    (4).W,a1
  2617.         MOVE.L    (IVAUD1+IV_CODE,A1),-(A7)
  2618.         move.l    (IVAUD1+IV_DATA,a1),a1
  2619.         RTS
  2620.  
  2621. .aud1_cont    MOVE.W    #INTF_AUD1,(_custom+intreq)
  2622.         BCLR    #8,D6
  2623.  
  2624. .AUD2        BTST    #9,D6
  2625.         BEQ.S    .AUD3
  2626.  
  2627.     ;call handler/server
  2628.         move.l    #$200,d1
  2629.         PEA    .aud2_cont(PC)
  2630.         move.l    (4).W,a1
  2631.         MOVE.L    (IVAUD2+IV_CODE,A1),-(A7)
  2632.         move.l    (IVAUD2+IV_DATA,a1),a1
  2633.         RTS
  2634.  
  2635. .aud2_cont    MOVE.W    #INTF_AUD2,(_custom+intreq)
  2636.         BCLR    #9,D6
  2637.  
  2638. .AUD3        BTST    #$A,D6
  2639.         BEQ.S    .aud_end
  2640.  
  2641.     ;call handler/server
  2642.         move.l    #$400,d1
  2643.         PEA    .aud3_cont(PC)
  2644.         move.l    (4).W,a1
  2645.         MOVE.L    (IVAUD3+IV_CODE,A1),-(A7)
  2646.         move.l    (IVAUD3+IV_DATA,a1),a1
  2647.         RTS
  2648.  
  2649. .aud3_cont    MOVE.W    #INTF_AUD3,(_custom+intreq)
  2650.         BCLR    #$A,D6
  2651.  
  2652. .aud_end    movem.l    (a7)+,d0-d1/D6/a0-a1/a5-a6
  2653.         rte
  2654.  
  2655. INTSERVNODE_AUDIO0
  2656.         dc.l    0        ;LN_SUCC
  2657.         dc.l    0        ;LN_PRED
  2658.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2659.         dc.b    120        ;LN_PRI
  2660.         dc.l    0        ;LN_NAME
  2661.         dc.l    0        ;IS_DATA
  2662.         dc.l    _AUD0_CODE    ;IS_CODE
  2663.  
  2664. INTSERVNODE_AUDIO1
  2665.         dc.l    0        ;LN_SUCC
  2666.         dc.l    0        ;LN_PRED
  2667.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2668.         dc.b    120        ;LN_PRI
  2669.         dc.l    0        ;LN_NAME
  2670.         dc.l    0        ;IS_DATA
  2671.         dc.l    _AUD1_CODE    ;IS_CODE
  2672.  
  2673. INTSERVNODE_AUDIO2
  2674.         dc.l    0        ;LN_SUCC
  2675.         dc.l    0        ;LN_PRED
  2676.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2677.         dc.b    120        ;LN_PRI
  2678.         dc.l    0        ;LN_NAME
  2679.         dc.l    0        ;IS_DATA
  2680.         dc.l    _AUD2_CODE    ;IS_CODE
  2681.  
  2682. INTSERVNODE_AUDIO3
  2683.         dc.l    0        ;LN_SUCC
  2684.         dc.l    0        ;LN_PRED
  2685.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2686.         dc.b    120        ;LN_PRI
  2687.         dc.l    0        ;LN_NAME
  2688.         dc.l    0        ;IS_DATA
  2689.         dc.l    _AUD3_CODE    ;IS_CODE
  2690.  
  2691. _AUD0_CODE
  2692. _AUD1_CODE
  2693. _AUD2_CODE
  2694. _AUD3_CODE
  2695.         RTS
  2696.  
  2697.  
  2698. ;---------------
  2699.  
  2700. INT_78        movem.l    d0-d1/a0-a1/a5-a6,-(a7)
  2701.         move.w    (_custom+intreqr),d0
  2702.         and.w    #INTF_EXTER,d0
  2703.         beq    .exter_end
  2704.  
  2705.     ;call handler/server
  2706. .exter        PEA    .exter_cont(PC)
  2707.         move.l    (4).W,a1
  2708.         MOVE.L    (IVEXTER+IV_CODE,A1),-(A7)
  2709.         move.l    (IVEXTER+IV_DATA,a1),a1
  2710.         RTS
  2711. .exter_cont
  2712. .exter_end
  2713.         move.w    #INTF_EXTER,(_custom+intreq)
  2714.         movem.l    (a7)+,d0-d1/a0-a1/a5-a6
  2715.         rte
  2716.  
  2717. INTSERVNODE_CIAB
  2718.         dc.l    0        ;LN_SUCC
  2719.         dc.l    0        ;LN_PRED
  2720.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2721.         dc.b    120        ;LN_PRI
  2722.         dc.l    _ciabname    ;LN_NAME
  2723.         dc.l    0        ;IS_DATA
  2724.         dc.l    INT_CIAB    ;IS_CODE
  2725.  
  2726. ;---------------
  2727.  
  2728. INT_SERVER
  2729.         move.l    (IV_NODE,a1),-(a7)
  2730. .loop        move.l    (a7),d0
  2731.         beq    .end
  2732.         move.l    d0,a0
  2733.         move.l    (LN_SUCC,a0),(a7)
  2734.         move.l    (IS_DATA,a0),a1
  2735.         TST.L    (IS_CODE,A0)
  2736.         BEQ.S    .loop
  2737.         move.l    (IS_CODE,a0),a6
  2738.         pea    (.loop)
  2739.         lea    (_custom),a0    ;some require this
  2740.         jmp    (a6)
  2741. .end        addq.l    #4,a7
  2742.         rts
  2743.  
  2744. ;---------------
  2745.  
  2746. _SETINTVECTOR    ;D0-INT#, A1-INTERRUPTNODE, RET D0-OLD INTERRUPTNODE
  2747.         CMP.L    #$7,D0
  2748.         BLO.S    .NOTSUPPORTED
  2749.         CMP.L    #$B,D0
  2750.         BHS.S    .NOTSUPPORTED
  2751.         MULU    #$C,D0
  2752.         MOVE.L    4.W,A0
  2753.         LEA.L    IntVects(A0,D0.L),A0
  2754.         MOVE.L    IV_NODE(A0),D0
  2755.         MOVE.L    A1,IV_NODE(A0)
  2756.         RTS
  2757.  
  2758. .NOTSUPPORTED    pea    _LVOSetIntVector
  2759.         pea    _execname
  2760.         bra    _emufail
  2761.  
  2762.  
  2763. _AddIntServer    ;d0=intnumber a1=interrupt
  2764.  
  2765.         movem.l    a2-a4,-(a7)
  2766.         mulu    #IV_SIZE,D0
  2767.         lea    (IntVects+IV_NODE,a6,d0.l),a2    ;a2 = list base
  2768.         move.w    #INTF_INTEN,(_custom+intena)
  2769.  
  2770.         move.b    (LN_PRI,a1),d1            ;d1 = priority
  2771.         sub.l    a3,a3                ;a3 = predecessor
  2772.         move.l    (a2),a4                ;a4 = successor
  2773.  
  2774. .next        move.l    a4,d0
  2775.         beq    .hangin
  2776.         cmp.b    (LN_PRI,a4),d1
  2777.         bgt    .hangin
  2778.         move.l    a4,a3
  2779.         move.l    (LN_SUCC,a3),a4
  2780.         bra    .next
  2781.  
  2782. .hangin        move.l    a3,(LN_PRED,a1)
  2783.         bne    .hi1
  2784.         move.l    a2,a3                ;LN_SUCC == 0 !...
  2785. .hi1        move.l    a1,(LN_SUCC,a3)
  2786.         move.l    a4,(LN_SUCC,a1)
  2787.         beq    .hi2
  2788.         move.l    a1,(LN_PRED,a4)
  2789. .hi2
  2790. .end        move.w    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  2791.         movem.l    (a7)+,a2-a4
  2792.         rts
  2793.  
  2794.  ifeq 1
  2795.     MOVE.L    D2,-(A7)
  2796.     MOVE.L    D0,D2
  2797.     MOVE.L    D0,D1
  2798.     MULU.W    #IV_SIZE,D0
  2799.     LEA       (IntVects,A6,D0.W),A0
  2800.     MOVE.L    (A0),A0
  2801.     MOVE.W    #INTF_INTEN,(_custom+intena)
  2802.     ADDQ.B    #1,(IDNestCnt,A6)
  2803.     BSR.W     _Enqueue
  2804.     MOVE.W    #-$8000,D0
  2805.     BSET      D2,D0
  2806.     MOVE.W    D0,(_custom+intena)
  2807.     SUBQ.B    #1,(IDNestCnt,A6)
  2808.     BGE.S     .1654
  2809.     MOVE.W    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  2810. .1654    MOVE.L    (A7)+,D2
  2811.     RTS
  2812.  endc
  2813.  
  2814. _RemIntServer    ;d0=intnumber a1=interrupt
  2815.  
  2816.     ;this is a workaround for Millenium2·2, which does not set D0 correctly
  2817.         cmp.l    #$20,d0
  2818.         blo    .ok
  2819.         moveq    #5,d0
  2820. .ok
  2821.         movem.l    a2-a4,-(a7)
  2822.         mulu    #IV_SIZE,D0
  2823.         lea    (IntVects+IV_NODE,a6,d0.l),a2    ;a2 = list base
  2824.         move.w    #INTF_INTEN,(_custom+intena)
  2825.  
  2826.         sub.l    a3,a3                ;a3 = predecessor
  2827.         move.l    a2,a0
  2828.         
  2829. .next        move.l    (LN_SUCC,a0),a0
  2830.         cmp.l    a0,a1
  2831.         beq    .hangout
  2832.         move.l    a0,a3
  2833.         bra    .next
  2834.  
  2835. .hangout    move.l    (LN_SUCC,a1),a4            ;a4 = successor
  2836.         move.l    a4,d0
  2837.         beq    .ho1
  2838.         move.l    a3,(LN_PRED,a4)
  2839. .ho1        move.l    a3,d0
  2840.         bne    .ho2
  2841.         move.l    a2,a3                ;LN_SUCC == 0 !...
  2842. .ho2        move.l    a4,(LN_SUCC,a3)
  2843.  
  2844. .end        move.w    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  2845.         movem.l    (a7)+,a2-a4
  2846.         rts
  2847.  
  2848. _ExitIntr    MOVEM.L    (A7)+,D0-D1/A0-A1/A5-A6
  2849.         RTE
  2850.  
  2851. **************************************************************************
  2852. *   LIBRARY FUNCTIONS                                                    *
  2853. **************************************************************************
  2854.  
  2855. OPENLIB:
  2856.         move.l    a2,-(a7)
  2857.  
  2858.         lea    _libtable,a2
  2859. .next        move.l    (a2)+,a0
  2860.         move.l    a0,d0
  2861.         beq    .err
  2862.         bsr    _strcmp
  2863.         beq    .found
  2864.         addq.l    #4,a2
  2865.         bra    .next
  2866.  
  2867. .found        move.l    (a2),a0
  2868.         jsr    (a0)        ;init
  2869.         
  2870.         move.l    (a7)+,a2
  2871.         rts
  2872.  
  2873. .err
  2874.         pea    _LVOOpenLibrary
  2875.         pea    _execname
  2876.         bra    _emufail
  2877.  
  2878. **************************************************************************
  2879. *   DEVICE FUNCTIONS                                                     *
  2880. **************************************************************************
  2881.  
  2882. _OpenDevice    ;a0=name d0=unit a1=ioreq d1=flags
  2883.         moveM.l    D0/A0-a2,-(a7)
  2884.  
  2885.         MOVE.L    A0,A1
  2886.         lea    _devtable,a2
  2887. .next        move.l    (a2)+,a0
  2888.         move.l    a0,d0
  2889.         beq    .err
  2890.         bsr    _strcmp
  2891.         beq    .found
  2892.         addq.l    #4,a2
  2893.         bra    .next
  2894.  
  2895. .err        pea    _LVOOpenDevice
  2896.         pea    _execname
  2897.         bra    _emufail
  2898.  
  2899. .found
  2900.     cmp.l    #"cd.d",(A0)        ; but what with A0 if will odd address (68000)
  2901.         beq    .dontopen    ; added by JOTD
  2902.  
  2903.         MOVE.L    8(A7),A1
  2904.     IFNE    CORRECTDEVICES
  2905.         MOVE.L    (A2),(IO_DEVICE,A1)
  2906.     ELSE
  2907.         move.l    (a0),(IO_DEVICE,a1)
  2908.     ENDC
  2909.         move.l    (A7),(IO_UNIT,a1)
  2910.         move.b    d1,(IO_FLAGS,A1)
  2911.         MOVEM.L    (A7)+,D0/A0-A2
  2912.         moveq    #0,d0
  2913.         move.b    d0,(IO_ERROR,a1)
  2914.         rts
  2915.  
  2916. .dontopen
  2917.         MOVEM.L    (A7)+,D0/A0-A2
  2918.         moveq.l    #-1,D0
  2919.         rts
  2920.  
  2921. _InputHandlerVBI
  2922.     ;check LMB
  2923.         btst    #CIAB_GAMEPORT0,(_ciaa+ciapra)
  2924.         seq    d0
  2925.         cmp.b    (_last_lmb),d0
  2926.         beq    .lmbend
  2927.         move.b    d0,(_last_lmb)
  2928.         lea    _inputevent,a0
  2929.         clr.l    (ie_NextEvent,a0)
  2930.         move.b    #IECLASS_RAWMOUSE,(ie_Class,a0)
  2931.         clr.b    (ie_SubClass,a0)
  2932.         move.w    #IECODE_LBUTTON,(ie_Code,a0)
  2933.         tst.b    d0
  2934.         bne    .lmb1
  2935.         or.w    #IECODE_UP_PREFIX,(ie_Code,a0)
  2936. .lmb1        moveq    #0,d0
  2937.         move.b    (_last_lmb),d1
  2938.         beq    .lmb2
  2939.         or.w    #IEQUALIFIER_LEFTBUTTON,d0
  2940. .lmb2        move.b    (_last_rmb),d1
  2941.         beq    .lmb3
  2942.         or.w    #IEQUALIFIER_RBUTTON,d0
  2943. .lmb3        move.w    d0,(ie_Qualifier,a0)
  2944.         pea    .lmbend
  2945.         move.l    _inputhandler,a1
  2946.         move.l    (IS_CODE,a1),-(a7)
  2947.         move.l    (IS_DATA,a1),a1
  2948.         rts                    ;a0=InputEvent a1=HandlerData
  2949. .lmbend
  2950.     ;check RMB
  2951.         btst    #POTGOB_DATLY-8,(_custom+potinp)
  2952.         seq    d0
  2953.         cmp.b    (_last_rmb),d0
  2954.         beq    .rmbend
  2955.         move.b    d0,(_last_rmb)
  2956.         lea    _inputevent,a0
  2957.         clr.l    (ie_NextEvent,a0)
  2958.         move.b    #IECLASS_RAWMOUSE,(ie_Class,a0)
  2959.         clr.b    (ie_SubClass,a0)
  2960.         move.w    #IECODE_RBUTTON,(ie_Code,a0)
  2961.         tst.b    d0
  2962.         bne    .rmb1
  2963.         or.w    #IECODE_UP_PREFIX,(ie_Code,a0)
  2964. .rmb1        moveq    #0,d0
  2965.         move.b    (_last_lmb),d1
  2966.         beq    .rmb2
  2967.         or.w    #IEQUALIFIER_LEFTBUTTON,d0
  2968. .rmb2        move.b    (_last_rmb),d1
  2969.         beq    .rmb3
  2970.         or.w    #IEQUALIFIER_RBUTTON,d0
  2971. .rmb3        move.w    d0,(ie_Qualifier,a0)
  2972.         pea    .rmbend
  2973.         move.l    _inputhandler,a1
  2974.         move.l    (IS_CODE,a1),-(a7)
  2975.         move.l    (IS_DATA,a1),a1
  2976.         rts                    ;a0=InputEvent a1=HandlerData
  2977. .rmbend
  2978.     ;check MouseMove
  2979.         move.w    (_custom+joy0dat),d0
  2980.         move.w    (_last_joy0dat),d1
  2981.         cmp.w    d0,d1
  2982.         beq    .rts
  2983.         move.w    d0,(_last_joy0dat)
  2984.         lea    _inputevent,a0
  2985.         clr.l    (ie_NextEvent,a0)
  2986.         move.b    #IECLASS_RAWMOUSE,(ie_Class,a0)
  2987.         clr.b    (ie_SubClass,a0)
  2988.         move.w    #IECODE_NOBUTTON,(ie_Code,a0)
  2989.         clr.w    (ie_Qualifier,a0)
  2990.         movem.l    d2-d3,-(a7)
  2991.         moveq    #0,d2
  2992.         move.b    d1,d2
  2993.         moveq    #0,d3
  2994.         move.b    d0,d3
  2995.         sub.w    d2,d3
  2996.         cmp.w    #127,d3
  2997.         bgt    .xsub
  2998.         cmp.w    #-128,d3
  2999.         bge    .xok
  3000.         add.w    #512,d3
  3001. .xsub        sub.w    #256,d3
  3002. .xok        move.w    d3,(ie_X,a0)
  3003.         movem.l    (a7)+,d2-d3
  3004.         lsr.w    #8,d0
  3005.         lsr.w    #8,d1
  3006.         sub.w    d1,d0
  3007.         cmp.w    #127,d0
  3008.         bgt    .ysub
  3009.         cmp.w    #-128,d0
  3010.         bge    .yok
  3011.         add.w    #512,d0
  3012. .ysub        sub.w    #256,d0
  3013. .yok        move.w    d0,(ie_Y,a0)
  3014.         move.l    _inputhandler,a1
  3015.         move.l    (IS_CODE,a1),-(a7)
  3016.         move.l    (IS_DATA,a1),a1
  3017. .rts        rts                    ;a0=InputEvent a1=HandlerData
  3018.  
  3019. _InputHandlerPI    lea    _inputevent,a0
  3020.         clr.l    (ie_NextEvent,a0)
  3021.         move.b    #IECLASS_RAWKEY,(ie_Class,a0)
  3022.         clr.b    (ie_SubClass,a0)
  3023.         moveq    #0,d0
  3024.         move.b    (KBDVAL),d0
  3025.         move.w    d0,(ie_Code,a0)
  3026.         clr.w    (ie_Qualifier,a0)
  3027.         move.l    _inputhandler,a1
  3028.         move.l    (IS_CODE,a1),-(a7)
  3029.         move.l    (IS_DATA,a1),a1
  3030.         rts                    ;a0=InputEvent a1=HandlerData
  3031.  
  3032. _SendIO
  3033. _DoIO        ;a1=ioreq
  3034.         tst.l    (IO_DEVICE,A1)
  3035.         beq    .cd                ; not found: ignore! (JOTD)
  3036.  
  3037.         move.w    (IO_COMMAND,a1),d0        ;d0=command
  3038.     IFNE    CORRECTDEVICES
  3039.         MOVE.L    _tddevtable+4(PC),D1
  3040.         CMP.L    (IO_DEVICE,A1),D1
  3041.     ELSE
  3042.         cmp.l    #"trac",(IO_DEVICE,a1)
  3043.     ENDC
  3044.         beq    .trackdisk
  3045.     IFNE    CORRECTDEVICES
  3046.         MOVE.L    _inpdevtable+4(PC),D1
  3047.         CMP.L    (IO_DEVICE,A1),D1
  3048.     ELSE
  3049.         cmp.l    #"inpu",(IO_DEVICE,a1)
  3050.     ENDC
  3051.         beq    .input
  3052.  
  3053.     ; cd.device added by Jeff
  3054.  
  3055.     IFNE    CORRECTDEVICES
  3056.         MOVE.L    _cddevtable+4(PC),D1
  3057.         CMP.L    (IO_DEVICE,A1),D1
  3058.     ELSE
  3059.         cmp.l    #"cd.d",(IO_DEVICE,a1)
  3060.     ENDC
  3061.         beq    .cd
  3062.  
  3063.     ; cdtv.device added by Jeff
  3064.  
  3065.     IFNE    CORRECTDEVICES
  3066.         MOVE.L    _cdtvdevtable+4(PC),D1
  3067.         CMP.L    (IO_DEVICE,A1),D1
  3068.     ELSE
  3069.         cmp.l    #"cdtv",(IO_DEVICE,a1)
  3070.     ENDC
  3071.         beq    .cd
  3072.  
  3073.     ; keyboard.device added by Jeff
  3074.  
  3075.     IFNE    CORRECTDEVICES
  3076.         MOVE.L    _kbdevtable+4(PC),D1
  3077.         CMP.L    (IO_DEVICE,A1),D1
  3078.     ELSE
  3079.         cmp.l    #"keyb",(IO_DEVICE,a1)
  3080.     ENDC
  3081.         beq    .keyboard
  3082.  
  3083. .fail
  3084.     move.l    D0,D6
  3085.  
  3086.         pea    _LVODoIO
  3087.         pea    _execname
  3088.         bra    _emufail
  3089.         
  3090. .cd
  3091.         moveq.l    #0,D0    ; cd.device,cdtv.device: do nothing
  3092.         rts
  3093.  
  3094. .keyboard
  3095.         cmp.w    #KBD_READMATRIX,d0
  3096.         beq    .kb_readmatrix
  3097.         cmp.w    #KBD_READEVENT,d0
  3098.  
  3099.         cmp.w    #CMD_CLEAR,d0
  3100.  
  3101.         BRA    .fail
  3102. .kb_readmatrix
  3103.         move.l    a1,-(SP)
  3104.         moveq    #15,d0
  3105.         move.l    (IO_LENGTH,a1),d1
  3106.         move.l    (IO_DATA,a1),a0
  3107.         cmp.l    d0,d1
  3108.         bls.s    .lower
  3109.         move.w    d0,d1
  3110. .lower
  3111.         move.l    d1,(IO_ACTUAL,a1)
  3112.         move.l    (IO_DEVICE,a1),a1
  3113.         lea    $136(a1),a1
  3114.         bra.s    .goto
  3115. .loop
  3116.         move.b    (a1)+,(a0)+
  3117. .goto
  3118.         dbra    d1,.loop
  3119.         movea.l    (SP)+,a1
  3120.  
  3121.         clr.b    (IO_ERROR,a1)
  3122.         moveq.l    #0,d0
  3123.         rts
  3124.  
  3125. .input        cmp.w    #CMD_RESET,d0
  3126.         beq    .ret
  3127.         cmp.w    #IND_ADDHANDLER,d0
  3128.         beq    .i_addh
  3129.         cmp.w    #IND_REMHANDLER,d0
  3130.         beq    .i_remh
  3131.         cmp.w    #IND_SETMPORT,d0
  3132.         beq    .ret
  3133.         cmp.w    #IND_SETMTRIG,d0
  3134.         beq    .i_setmtrig
  3135.         BRA    .fail
  3136.  
  3137. .i_addh        move.w    (_custom+joy0dat),(_last_joy0dat)
  3138.         TST.L    _inputhandler
  3139.         BNE    .fail
  3140.         move.l    (IO_DATA,a1),_inputhandler
  3141.         moveq.l    #0,D0            ; added by JOTD
  3142.         rts
  3143. .i_remh        clr.l    _inputhandler
  3144.         rts
  3145. .i_setmtrig    move.l    (IO_DATA,a1),.gpt
  3146.         moveq.l    #0,D0            ; added by JOTD
  3147.         rts
  3148. .gpt        dc.l    0
  3149.  
  3150. .trackdisk    cmp.w    #CMD_READ,d0
  3151.         beq    .td_read
  3152.         cmp.w    #CMD_CLEAR,d0
  3153.         beq    .ret
  3154.         cmp.w    #TD_MOTOR,d0
  3155.         beq    .ret
  3156.         cmp.w    #TD_FORMAT,d0
  3157.         beq    .td_write
  3158.         cmp.w    #TD_REMOVE,d0
  3159.         beq    .ret
  3160.         cmp.w    #TD_CHANGENUM,d0
  3161.         beq    .ret
  3162.         cmp.w    #TD_CHANGESTATE,d0
  3163.         beq    .ret
  3164.         cmp.w    #ETD_SEEK,d0
  3165.         beq    .td_seek    ; added by JOTD
  3166.         cmp.w    #TD_SEEK,d0
  3167.         beq    .td_seek    ; added by JOTD
  3168.         cmp.w    #ETD_READ,d0
  3169.         beq    .td_read
  3170.         cmp.w    #ETD_WRITE,d0
  3171.         beq    .td_write
  3172.         cmp.w    #CMD_WRITE,d0
  3173.         beq    .td_write    ; added by JOTD
  3174.         cmp.w    #ETD_UPDATE,d0
  3175.         beq    .ret
  3176.         cmp.w    #ETD_CLEAR,d0
  3177.         beq    .ret
  3178.         cmp.w    #ETD_MOTOR,d0
  3179.         beq    .ret
  3180.         cmp.w    #CMD_UPDATE,d0    ; added by JOTD
  3181.         beq    .ret
  3182.         BRA.W    .fail
  3183.  
  3184. .td_seek:    ; seek only moves the heads, nothing is read!
  3185.         beq    .ret
  3186.  
  3187.     ;"deuteros" expects that a1 is unchanged !
  3188. .td_read    movem.l    d2/a1,-(a7)
  3189.         move.l    (IO_OFFSET,a1),d0
  3190.         move.l    (IO_LENGTH,a1),d1
  3191.         move.l    d1,(IO_ACTUAL,a1)    ; Mr.Larmer
  3192.         move.l    (IO_UNIT,a1),d2
  3193.         addq.l    #1,d2
  3194.         move.l    (IO_DATA,a1),a0
  3195.         move.l    (_RESLOAD),a1
  3196.         jsr    (resload_DiskLoad,a1)
  3197.         movem.l    (a7)+,d2/a1
  3198. .ret        clr.b    (IO_ERROR,a1)
  3199.         moveq.l    #0,D0            ; added by JOTD
  3200.         rts
  3201.  
  3202. .td_write    tst.l    _p3    ; JOTD: what's this ???
  3203.         bne.b    .td_dowrite
  3204.         move.l    OSM_JSTFLAGS,D0
  3205.         btst    #AFB_NOOSSWAP,D0    ; JST's NOOSSWAP set
  3206.         bne.b    .f            ; don't write!
  3207. .td_dowrite
  3208.         movem.l    a1-a2,-(a7)
  3209.         clr.b    (IO_ERROR,a1)
  3210.         move.l    (IO_LENGTH,a1),d0    ;size
  3211.         lea    (.disk),a0
  3212.         move.l    (IO_UNIT,a1),d1
  3213.         add.b    #"1",d1
  3214.         move.b    d1,(5,a0)        ;name
  3215.         move.l    (IO_OFFSET,a1),d1    ;offset
  3216.         move.l    (IO_DATA,a1),a1        ;address
  3217.         move.l    (_RESLOAD),a2
  3218.         jsr    (resload_SaveFileOffset,a2)
  3219.         movem.l    (a7)+,a1-a2
  3220.         rts
  3221. .f        st    (IO_ERROR,a1)
  3222.         rts
  3223.  
  3224. .disk        dc.b    "Disk.",0,0,0
  3225.  
  3226. _SENDAUDIO
  3227.         CLR.B    IO_ERROR(A1)
  3228.         MOVEQ.L    #0,D0
  3229.         RTS
  3230.  
  3231. _WAITIO
  3232.     IFNE    CORRECTDEVICES
  3233.         MOVE.L    _cddevtable+4(PC),D1
  3234.         CMP.L    (IO_DEVICE,A1),D1
  3235.     ELSE
  3236.         cmp.l    #"cd.d",(IO_DEVICE,a1)
  3237.     ENDC
  3238.         beq    .cd
  3239.  
  3240.     IFNE    CORRECTDEVICES
  3241.         MOVE.L    _cdtvdevtable+4(PC),D1
  3242.         CMP.L    (IO_DEVICE,A1),D1
  3243.     ELSE
  3244.         cmp.l    #"cdtv",(IO_DEVICE,a1)
  3245.     ENDC
  3246.         beq    .cd
  3247.  
  3248. .fail        pea    _LVOWaitIO
  3249.         pea    _execname
  3250.         bra    _emufail
  3251.         
  3252. .cd
  3253.         CLR.B    IO_ERROR(A1)
  3254.         moveq.l    #0,D0    ; cd.device,cdtv.device: do nothing
  3255.         RTS
  3256.  
  3257. _ABORTIO
  3258.         CLR.B    IO_ERROR(A1)
  3259.         MOVEQ.L    #0,D0
  3260.         RTS
  3261.  
  3262. _CHECKIO
  3263.         MOVE.L    A1,D0    ; request has completed
  3264.         RTS
  3265.  
  3266. **************************************************************************
  3267. *   RESOURCE FUNCTIONS                                                   *
  3268. **************************************************************************
  3269.  
  3270. OPENRES        move.l    a2,-(a7)
  3271.  
  3272.         lea    _restable,a2
  3273. .next        move.l    (a2)+,a0
  3274.         move.l    a0,d0
  3275.         beq    .err
  3276.         bsr    _strcmp
  3277.         beq    .found
  3278.         addq.l    #4,a2
  3279.         bra    .next
  3280.  
  3281. .found        move.l    (a2),a0
  3282.         jsr    (a0)        ;init
  3283.         
  3284.         move.l    (a7)+,a2
  3285.         rts
  3286.  
  3287. .err        pea    _LVOOpenResource
  3288.         pea    _execname
  3289.         bra    _emufail
  3290.  
  3291. **************************************************************************
  3292. *   DISK.RESOURCE                                                        *
  3293. **************************************************************************
  3294.  
  3295. DISKINIT    move.l    _diskbase,d0
  3296.         beq    .init
  3297.         rts
  3298.  
  3299. .init
  3300.         move.l    #-_LVOReadUnitID,D0
  3301.         move.l    #5*4,d1
  3302.         lea    _diskname,a0
  3303.         bsr    _InitStruct
  3304.         move.l    d0,_diskbase
  3305.         move.l    d0,a0
  3306.  
  3307.         ; patches
  3308.  
  3309.         patch    _LVOGetUnit(a0),GETUNIT(pc)
  3310.  
  3311.         ; clears interrupt structure
  3312.  
  3313.         clr.l    (a0)+
  3314.         clr.l    (a0)+
  3315.         clr.l    (a0)+
  3316.         clr.l    (a0)+
  3317.         clr.l    (a0)
  3318.  
  3319.  
  3320.         rts
  3321.  
  3322. GETUNIT:
  3323.     moveq.l    #-1,d0        ; not exactly the thing to do but...
  3324.     rts
  3325.  
  3326.  
  3327. **************************************************************************
  3328. *   CIAA.RESOURCE                                                        *
  3329. **************************************************************************
  3330.  
  3331. CIAAINIT    move.l    _ciaabase,d0
  3332.         beq    .init
  3333.         rts
  3334.  
  3335. .init        move.l    #-_LVOSetICR,d0
  3336.         move.l    #5*4,d1
  3337.         lea    _ciaaname(pc),a0
  3338.         bsr    _InitStruct
  3339.         move.l    d0,a0
  3340.         move.l    d0,_ciaabase
  3341.  
  3342.         patch    _LVOAddICRVector(a0),CIAAADDICRV(pc)
  3343.         patch    _LVORemICRVector(a0),CIAAREMICRV(pc)
  3344.  
  3345.         clr.l    (a0)+
  3346.         clr.l    (a0)+
  3347.         clr.l    (a0)+
  3348.         move.l    #INTSERVNODE_SP,(a0)+
  3349.         clr.l    (a0)
  3350.  
  3351.         MOVE.B    #$FF,$BFE701
  3352.  
  3353.         rts
  3354.  
  3355. INTSERVNODE_SP    dc.l    0        ;LN_SUCC
  3356.         dc.l    0        ;LN_PRED
  3357.         dc.b    NT_INTERRUPT    ;LN_TYPE
  3358.         dc.b    0        ;LN_PRI
  3359.         dc.l    0        ;LN_NAME
  3360.         dc.l    0        ;IS_DATA
  3361.         dc.l    INT_KBD        ;IS_CODE
  3362.  
  3363. INT_KBD
  3364.         movem.l    D2-D4/A6,-(SP)
  3365.         movea.l    A1,A6
  3366.         moveq    #0,D2
  3367.         move.b    $BFEC01,D2
  3368.  
  3369.         MOVE.B    #$41,$BFEE01
  3370.  
  3371. ;        ori.b    #$40,$BFEE01
  3372.  
  3373.         MOVEQ.L    #2,D3
  3374. .4        MOVE.L    D1,-(A7)
  3375.         MOVE.B    $DFF006,D1
  3376. .3        CMP.B    $DFF006,D1
  3377.         BEQ.S    .3
  3378.         MOVE.L    (A7)+,D1
  3379.         DBF    D3,.4
  3380.  
  3381.         moveq    #0,D4
  3382.         not.b    D2
  3383.         ror.b    #1,D2
  3384.  
  3385.         MOVE.B    D2,KBDVAL
  3386.  
  3387.         cmpi.b    #$78,D2
  3388.         bne.s    lbC000078
  3389.  
  3390.         illegal
  3391.     ifeq    1
  3392.         bset    #0,$134(A6)
  3393.         beq.s    lbC00007E
  3394.         bset    #1,$134(A6)
  3395.         bne.w    lbC00012E
  3396.         movea.l    $124(A6),A1
  3397.         tst.l    (A1)
  3398.         beq.w    lbC00012C
  3399. lbC00005E
  3400.         move.l    (A1),D3
  3401.         beq.w    lbC00012E
  3402.         addq.w    #1,$132(A6)
  3403.         move.l    A6,-(SP)
  3404.         movea.l    $24(A6),A6
  3405.         jsr    -$B4(A6)
  3406.         movea.l    (SP)+,A6
  3407.         movea.l    D3,A1
  3408.         bra.s    lbC00005E
  3409.     endc
  3410. lbC000078
  3411.         bclr    #0,$134(A6)
  3412. lbC00007E
  3413.         move.w    D2,D1
  3414.         andi.w    #$7F,D1
  3415.         cmpi.w    #$71,D1
  3416.         bhi.w    lbC0000EA
  3417.         move.w    D1,D0
  3418.         andi.w    #7,D0
  3419.         lsr.w    #3,D1
  3420.         lea    $136(A6),A0
  3421.         btst    #7,D2
  3422.         bne.s    lbC0000AE
  3423.         bset    D0,0(A0,D1.W)
  3424.         cmpi.w    #12,D1
  3425.         bne.s    lbC0000CE
  3426.         bset    D0,$135(A6)
  3427.         bra.s    lbC0000CE
  3428. lbC0000AE
  3429.         bclr    D0,0(A0,D1.W)
  3430.         cmpi.w    #12,D1
  3431.         bne.s    lbC0000CE
  3432.         bclr    D0,$135(A6)
  3433.         bra.s    lbC0000CE
  3434. lbW0000BE
  3435.         dc.w    $80,$E0,$E0,$F0,$804,$7C,0,0
  3436. lbC0000CE
  3437.         move.w    D2,D1
  3438.         andi.w    #$7F,D1
  3439.         move.w    D1,D0
  3440.         andi.w    #7,D0
  3441.         lsr.w    #3,D1
  3442.         lea    lbW0000BE(PC),A0
  3443.         btst    D0,0(A0,D1.W)
  3444.         beq.s    lbC0000EA
  3445.         ori.w    #$100,D4
  3446. lbC0000EA
  3447.         move.w    $72(A6),D1
  3448.         move.w    D1,D0
  3449.         addq.w    #4,D0
  3450.         andi.w    #$7F,D0
  3451.         cmp.w    $70(A6),D0
  3452.         bne.s    lbC000108
  3453.         move.w    D1,D0
  3454.         move.w    #$7D,D2
  3455.         subq.w    #4,D1
  3456.         andi.w    #$7F,D1
  3457. lbC000108
  3458.         move.w    D2,$74(A6,D1.W)
  3459.         or.b    $135(A6),D4
  3460.         move.w    D4,$76(A6,D1.W)
  3461.         move.w    D0,$72(A6)
  3462. ;        btst    #0,$3D(A6)
  3463. ;        bne.s    lbC00012C
  3464. ;        movea.l    $48(A6),A1
  3465. ;        tst.l    (A1)
  3466. ;        beq.s    lbC00012C
  3467. ;        bsr.l    *-$FFFF0278
  3468. ;lbC00012C
  3469.  
  3470.         MOVE.B    #$1,$BFEE01
  3471.  
  3472. ;        andi.b    #$BF,$BFEE01
  3473.  
  3474. lbC00012E
  3475.         MOVE.B    KBDVAL,d0
  3476.         TST.L    OSM_SLVTRAINER
  3477.         BEQ.S    .NOTRAINER
  3478.         MOVE.L    OSM_SLVTRAINER(PC),A0
  3479.         JSR    (A0)
  3480. .NOTRAINER
  3481.         MOVE.B    D0,KBDVAL
  3482.         BEQ.S    .1
  3483.         move.l    (_Slave),a0
  3484.         CMP.B    (ws_keyexit,a0),D0
  3485.         BEQ.S    .QUIT
  3486. .1
  3487.         movem.l    (SP)+,D2-D4/A6
  3488.         move.l    _inputhandler(PC),d0
  3489.         bne    _InputHandlerPI
  3490.         rts
  3491.  
  3492. .QUIT        PEA    TDREASON_OK
  3493.         MOVE.L    _RESLOAD(PC),-(A7)
  3494.         add.l    #resload_Abort,(a7)
  3495.         rts
  3496.  
  3497. CIAAADDICRV    move.l    #$80,d1
  3498.         bset    d0,d1
  3499.         move.b    d1,$bfed01
  3500.         bra.s    ADDICRV
  3501.  
  3502. CIABADDICRV
  3503.         move.l    #$80,d1
  3504.         bset    d0,d1
  3505.         move.b    d1,$bfdd00
  3506.  
  3507.  
  3508. ADDICRV        lsl.w    #2,d0
  3509.         move.l    (a6,d0.w),d1
  3510.         bne    .1
  3511.         move.l    a1,(a6,d0.w)
  3512. .1        move.l    d1,d0
  3513.         rts
  3514. CIAAREMICRV    moveq.l    #0,d1
  3515.         bset    d0,d1
  3516.         move.b    d1,$bfed01
  3517.         bra.s    REMICRV
  3518.  
  3519. CIABREMICRV    moveq.l    #0,d1
  3520.         bset    d0,d1
  3521.         move.b    d1,$bfdd00
  3522.  
  3523. REMICRV        lsl.w    #2,d0
  3524.         cmp.l    (a6,d0.w),a1
  3525.         bne    .1
  3526.         clr.l    (a6,d0.w)
  3527. .1        rts
  3528.  
  3529.  
  3530.  
  3531. INT_CIAA    move.l    _ciaabase,a6
  3532.         MOVE.B    $BFED01,D0
  3533. INT_CIA
  3534. .chk        Bclr    #0,D0
  3535.         BNE.S    .ta
  3536.         Bclr    #1,D0
  3537.         BNE.S    .tb
  3538.         Bclr    #2,D0
  3539.         BNE.S    .alarm
  3540.         Bclr    #3,D0
  3541.         BNE.S    .sp
  3542.         Bclr    #4,D0
  3543.         BNE.S    .flag
  3544.         RTS
  3545.  
  3546. .ta        MOVE.L    (A6),A0
  3547.         BRA.S    .IN
  3548. .tb        MOVE.L    (4,A6),A0
  3549.         BRA.S    .IN
  3550. .alarm        MOVE.L    (8,A6),A0
  3551.         BRA.S    .IN
  3552. .sp        MOVE.L    (12,A6),A0
  3553.         BRA.S    .IN
  3554. .flag        MOVE.L    (16,A6),A0
  3555.  
  3556. .IN        move.l    a0,d1
  3557.         beq    .chk
  3558.         MOVE.L    (IS_DATA,A0),A1
  3559.         MOVE.L    (IS_CODE,A0),A0
  3560.         movem.l    d0/a6,-(a7)
  3561.         Jsr    (A0)
  3562.         movem.l    (a7)+,d0/a6
  3563.         bra    .chk
  3564.  
  3565. **************************************************************************
  3566. *   CIAB.RESOURCE                                                        *
  3567. **************************************************************************
  3568.  
  3569. CIABINIT    move.l    _ciabbase,d0
  3570.         beq    .init
  3571.         rts
  3572.  
  3573. .init        move.l    #-_LVOSetICR,d0
  3574.         move.l    #5*4,d1
  3575.         lea    _ciabname(pc),a0
  3576.         bsr    _InitStruct
  3577.         move.l    d0,a0
  3578.         move.l    d0,_ciabbase
  3579.  
  3580.         patch    _LVOAddICRVector(a0),CIABADDICRV(pc)
  3581.         patch    _LVORemICRVector(a0),CIABREMICRV(pc)
  3582.         
  3583.         clr.l    (a0)+
  3584.         clr.l    (a0)+
  3585.         clr.l    (a0)+
  3586.         clr.l    (a0)+
  3587.         clr.l    (a0)
  3588.  
  3589.         MOVE.B    #$FF,$BFD500
  3590.         MOVE.B    #$FF,$BFD700
  3591.  
  3592.         rts
  3593.  
  3594. INT_CIAB    move.l    _ciabbase,a6
  3595.         MOVE.B    $BFDD00,D0
  3596.         bra    INT_CIA
  3597.  
  3598. **************************************************************************
  3599. **************************************************************************
  3600.  
  3601.     INCLUDE    dos.s
  3602.     INCLUDE    freeanim.s
  3603.     INCLUDE    nonvolatile.s
  3604.     INCLUDE    graphics.s
  3605.     INCLUDE    intuition.s
  3606.     INCLUDE    lowlevel.s
  3607.     INCLUDE    utility.s
  3608.     INCLUDE    keymap.s
  3609.     INCLUDE    diskfont.s
  3610.     INCLUDE    mathffp.s
  3611.     INCLUDE    mathtrans.s
  3612.  
  3613. **************************************************************************
  3614. **************************************************************************
  3615. *   CHIPMEMORYTABLE AND MEMORY MANAGEMENT DATA                           *
  3616. **************************************************************************
  3617.  
  3618. ;THIS HAS TO BE ABSOLUTELY THE LAST LABEL, THE TABLE HAS A LEN DEPENDING
  3619. ;  FROM THE SIZE OF THE MEMORY
  3620.     DC.B    'OSEMUEND'
  3621.     CNOP    0,8
  3622. _osemu_end
  3623. ALLOCMTAB
  3624.  
  3625.